如何解析AWK或PHP中的“中间”字段?

时间:2013-03-18 20:07:49

标签: php parsing awk

我的数据如下:

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

每行包含三个字段。位置,公司名称,以及它们的索引的最后一组数字。

我知道在AWK中我可以这样做:

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

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

这可以用AWK或PHP来满足我的需求,谢谢!

3 个答案:

答案 0 :(得分: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+)$#';

答案 1 :(得分: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

?>

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

答案 2 :(得分:1)

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

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

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

awk '{gsub("^" $1 "[ \t]*|[ \t]*" $NF "$","")}1' file