按字段分隔符格式化awk

时间:2016-04-19 03:40:45

标签: unix awk formatting

首先,我不想使用sed来删除最后一部分;原因是因为文件中有很多变量我不得不这样做。

echo $new

它会显示

Jack: Grow up far away. He loves food Hotdogs, Hamburgers, and steak. It has a lot more text. Metro Filer:

因此,我需要打破一个单独的文本行,尽可能地删除Metro Filer:,以便我可以将其用于所有其他变量(100多个其他变量)。

此外,它说It has a lot more text意味着那里有更多的文字,我只是不想制作一个庞大的字符串。开头和结尾只有一个冒号。

我希望它看起来像

Jack: Grow up far away. He loves food Hotdogs, Hamburgers, and steak. It has a lot more text.

我尝试使用awk -F ":"做了几件事,但似乎无法包括Jack:,所以任何帮助都会很棒!

1 个答案:

答案 0 :(得分:2)

awk中

$ echo "$new" | awk '{a=$1;for(i=2;i<NF-1;++i)a=a FS $i;print a}'
Jack: Grow up far away. He loves food Hotdogs, Hamburgers, and steak. It has a lot more text.

它将第一个字段分配给a,然后为除了最后两个字段之外的所有字段添加空格和下一个字段,最后打印变量。

更具可读性:

{
    string = $1
    for (i = 2; i < NF-1; ++i)
        string = string FS $i
    print string
}

revcut

$ echo "$new" | rev | cut -d ' ' -f 3- | rev
Jack: Grow up far away. He loves food Hotdogs, Hamburgers, and steak. It has a lot more text.

这会反转输出,然后从第三个开始提取所有空格分隔的字段,然后再将其反转。

参数扩展

$ echo "${new% * *}"
Jack: Grow up far away. He loves food Hotdogs, Hamburgers, and steak. It has a lot more text.

这就是说:从非常&remove的方式移除任何空间,以非贪婪的方式。

桑达

对于拥有许多变量而言,这并不比任何其他方法更复杂。

$ echo "$new" | sed 's/ [^ ]* [^ ]*$//'
Jack: Grow up far away. He loves food Hotdogs, Hamburgers, and steak. It has a lot more text.

这将从字符串的末尾删除一个空格和两个由另一个空格分隔的非空格组。