1

我的数据如下所示:

1 company 123
2 company name 321
3 company name, Inc. 456

每行包含三个字段。职位、公司名称和最后一组数字是它们的索引。

我知道在 AWK 我可以做这样的事情:

% cat companylist.txt | awk ' { print $1} '

哪个可以很好地处理位置编号。并且使用 $NF 将获得最后一个数字,即索引。但是公司名称的中间字段呢?我如何解析它,以便我最终得到三个字段,分别是位置、公司名称、索引。

这可以根据我的需要在 AWK 或 PHP 中完成,谢谢!

4

3 回答 3

3

您可以使用正则表达式检查锚定在开头和结尾的两个数字之间的字符串。

就像是:

#^\d+\s+(.*)\s+\d+$#
 ^^^^^^^    ^^^^^^ anchor numbers to end and start with at least one space after and before

preg_match在字符串上使用:

$pattern = '#^\d+\s+(.*)\s+\d+$#';
preg_match($pattern, $one_line_of_list, $matches);

编辑:要捕获数字,只需将模式更改为:

$pattern = '#^(\d+)\s+(.*)\s+(\d+)$#';
于 2013-03-18T20:12:00.113 回答
1

这不是一个常规的输入文件,例如它不是制表符分隔的。如果是这样,有一个第一个字段和一个最后一个字段以及中间的任意数量的字段应该被视为一个字段,可以这样做:

awk '{$1=$NF=""; $0=$0; $1=$1}1' file

如果中间“字段”中单词之间的空格数不重要。否则你可以尝试:

awk '{gsub("^" $1 "[ \t]*|[ \t]*" $NF "$","")}1' file
于 2013-03-18T21:31:11.337 回答
1

由于您没有提供数据来源,即文本文档等。我无法包含从源中读取数据的代码行,因此您需要在开头添加一些内容以循环遍历数据的来源。一旦你得到它,并创建循环机制,你可以使用这段代码将你的数据格式化为 3 个变量,然后用它做其他事情。

<?php
$string=line; // get a single line into the $string variable, from a loop or whatever.
$linearray=explode(' ', $string);
$lastplace=count($linearray)-1; // subtract 1 to account for starting from 0 in array
$position=$linearray[0]; // first one will always be the position
$index=$linearray[$lastplace]; // last one will always be the index
$i=1; //starting array position for your while loop
$companyname=""; //start company name with an empty string
while($i<$lastplace){ //cycle through all the middle chunks of the array to get the     company name
    $companyname.=$linearray[$i]; //adds any bits in the middle to the company name
    $companyname.=" "//adds a space in case there are more parts to add to it
    $i++;
}
// add function here to do something with the data

?>

如果它是公司名称的最后一部分,您甚至可以使它更漂亮并创建某种检查以不添加最后一个空格

于 2013-03-18T20:26:32.083 回答