使用AWK获取一行中的前x个字段

时间:2016-10-09 23:53:41

标签: awk gawk

我有一个命令行实用程序,可以生成如下输出:

Amelia Earhart Dam, Mystic River, Boston Harbor, Massachusetts                               Ref 42.3950∞ N,  71.0767∞ W
Annisquam, Lobster Cove, Massachusetts                                                       Sub 42.6550∞ N,  70.6767∞ W
Barnstable Harbor, Beach Point, Cape Cod Bay, Massachusetts                                  Sub 41.7217∞ N,  70.2850∞ W
Boston Light, Boston Harbor, Massachusetts                                                   Ref 42.3283∞ N,  70.8917∞ W
Boston, Boston Harbor, Massachusetts                                                         Ref 42.3548∞ N,  71.0534∞ W

我需要从行的开头通过州名提取项目(马萨诸塞州可以更改,但我可以输入变量)。

此AWK命令获取状态名称的所有内容:

awk -F 'Massachusetts' '{print $1}' stations.txt

如何配置AWK命令以包含状态名称,但不包括该行的其余部分?我想我总是可以进行后期处理,将状态名称添加到之前的字段中,但这似乎是AWKward,可以这么说。

3 个答案:

答案 0 :(得分:2)

您的awk程序打印出第一个Massachusetts分隔符字符串(-F等于输入字段分隔符 FS),但由于没有任何内容可以分开,赢得了#39 ; t输出分隔符。如果分隔符已输出,则awk将输出输出字段分隔符 OFS,默认情况下为空格。使用您的方法,您最多可以打印到FSFS

$ awk -F 'Massachusetts' '{print $1 FS}' stations.txt

您还可以将状态名称作为变量并替换从州名到结尾的所有内容($):

$ awk -v state="Massachusetts" '{sub(state".*$",state)} 1' stations.txt
Amelia Earhart Dam, Mystic River, Boston Harbor, Massachusetts
Annisquam, Lobster Cove, Massachusetts
Barnstable Harbor, Beach Point, Cape Cod Bay, Massachusetts
Boston Light, Boston Harbor, Massachusetts
Boston, Boston Harbor, Massachusetts

答案 1 :(得分:1)

如果您认为awk对此任务来说太过分了,那么grep就可以做到这一点。

grep -o '^.*Massachusetts' inputfile
Amelia Earhart Dam, Mystic River, Boston Harbor, Massachusetts
Annisquam, Lobster Cove, Massachusetts
Barnstable Harbor, Beach Point, Cape Cod Bay, Massachusetts
Boston Light, Boston Harbor, Massachusetts
Boston, Boston Harbor, Massachusetts

上面的代码将从行开始(^)开始打印,包括任何字符,直到Massachusetts。如果您希望有多个字段分隔符,那么

grep -o '^.*(Massachusetts|NEXT-SEPARATOR|ANOTHER-SEPARATOR|Nth-SEPRATOR)' inputfile

答案 2 :(得分:0)

使用sed

可能会更容易
$ sed -r 's/(Massachusetts).*/\1/' file

或,awk

的一种翻译方式
$ awk '{$0=gensub("(Massachusetts).*","\\1",1)}1' file