我有一个命令行实用程序,可以生成如下输出:
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,可以这么说。
答案 0 :(得分:2)
您的awk程序打印出第一个Massachusetts
分隔符字符串(-F
等于输入字段分隔符 FS
),但由于没有任何内容可以分开,赢得了#39 ; t输出分隔符。如果分隔符已输出,则awk将输出输出字段分隔符 OFS
,默认情况下为空格。使用您的方法,您最多可以打印到FS
和FS
:
$ 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