我有一个包含以下内容的.txt文件
Name: Dean AGE: 23 Hometown: Chicago
Name: Mary AGE: 68 hometown: New York
Name: Lisa age: 36 Hometown: Los angeles
Name: Greg Age: 18 hometown: London如何使用sed、awk或tr "Name:“、"Age:”和"Hometown:“,因此结果是:
Dean 23 Chicago
Mary 68 New York
Lisa 36 Los angeles
Greg 18 London我唯一能想到的就是遍历所有字段并打印出来,如下所示:
awk '{for (i=1;i<=NF;i++) {if ($i !~/:/) {print i,$i}}}'然而,这给了我一个结果:
Dean
23
Chicago
Mary
68
New
York
Lisa
36
Los
angeles
Greg
18
London正如您所看到的,它在自己的行上打印出每个字段,并将纽约和纽约以及洛杉矶和洛杉矶分开。
我的另一个想法是一个接一个地输入"Name:“、"Age:”和"Hometown:“,所有这些命令都用不同的命令来替换它们,这是可行的。例如:
sed 's/Name://g'但是,有没有办法使它不区分大小写,比如"age:“、"Age:”和"AGE:“
发布于 2015-04-11 01:39:35
如果您有GNU,它有一个用于不区分大小写的匹配的选项I:
sed 's/Name://gI;s/Age://gI;s/Hometown://gI' file稍作更改,awk解决方案就可以工作了:
awk '{ for(i=1;i<=NF;i++) {if ($i ~/:/) {$i=""}} ; print }' file发布于 2015-04-11 01:58:21
$ awk -F' ?[^ ]+: ' '{print $2, $3, $4}' file
Dean 23 Chicago
Mary 68 New York
Lisa 36 Los angeles
Greg 18 London或者一般用于任意数量的字段:
$ awk -F' ?[^ ]+: ' '{for (i=2;i<=NF;i++) printf "%s%s", $i, (i<NF?OFS:ORS)}' file
Dean 23 Chicago
Mary 68 New York
Lisa 36 Los angeles
Greg 18 London发布于 2015-04-11 01:50:19
您还可以使用此gnu-awk命令:
awk -v IGNORECASE=1 -v OFS='\t' -F ' *(Name|AGE|Hometown): *' ' {
printf $2; for (i=3; i<=NF; i++) printf OFS $i; print ""}' file
Dean 23 Chicago
Mary 68 New York
Lisa 36 Los angeles
Greg 18 Londonhttps://stackoverflow.com/questions/29567373
复制相似问题