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

使用AWK获取行中的前x个字段,awk,gawk,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,

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

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命令以包括状态名称,而不包括行的其余部分?我想我总是可以在处理后将状态名称添加到它前面的字段中,但可以说这似乎很尴尬。

使用
sed可能会更容易些

$ sed -r 's/(Massachusetts).*/\1/' file
或者,一种翻译为
awk

$ awk '{$0=gensub("(Massachusetts).*","\\1",1)}1' file 

awk程序打印第一个
分隔字符串(
-F
等于输入字段分隔符
FS
),但由于没有要分隔的内容,因此不会输出分隔符。如果输出了分隔符,awk将输出输出字段分隔符
OFS
,默认为空格。使用您的方法,您可以打印到
FS
FS

$ awk -F 'Massachusetts' '{print $1 FS}' stations.txt
您还可以将状态名称作为变量输入,并替换从状态名称到结尾的所有内容(
$
):


如果您认为
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
上述代码将从行首(
^
)开始打印,包括任何字符,直到
马萨诸塞州
。如果希望有多个字段分隔符,则


您应该包括一个输入行,如
Boston Light,Massachusetts Harbor,Massachusetts Ref 42.3283∞ N、 70.8917∞ W
否则,当状态名称出现在输入的前面时,您将得到失败的解决方案。另外,包含空格的州名称可能会有问题。很好,因为我正计划为相关的各个州传入一个变量。有趣的是,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
grep -o '^.*(Massachusetts|NEXT-SEPARATOR|ANOTHER-SEPARATOR|Nth-SEPRATOR)' inputfile