我对我有所了解,并且我希望格式化以下文字:
Trip.to.Washington.2004.08...
Florida.1993.12...
Aunt.Rose.2011.06...
我希望它显示如下:
Trip to Washington (2004)
Florida (1993)
Aunt Rose (2011)
标题中的单词数量与一年后的单词数量不同。分隔符有时是空格而不是句点。
编辑:
我能够使用以下方法获得所需的输出:
echo Trip.to.Washington.2004.08... |
sed -n 's/\([0-9][0-9][0-9][0-9]\).*/\1/p' |
gawk 'BEGIN { FS="." } { print $1" "$2" "$3" ("$NF")" }'
返回:
Trip to Washington (2004)
问题是如果标题中有更多或更少的单词,则会失败。如果单词除了句点以外的其他任何内容,它也会失败。
我还发现可以使用以下方法返回除最后一个字段之外的每个字段:
awk '{$NF=""; print $0}' file
不幸的是,我对gawk的体验非常有限。我还没有找到如何在我现有的gawk中正确使用这个陈述的线索。
答案 0 :(得分:0)
使用sed
:
$ sed 's/\([0-9]\{4\}\).*/(\1)/; s/\./ /g' foo
Trip to Washington (2004)
Florida (1993)
Aunt Rose (2011)
说明:
s/\([0-9]\{4\}\).*/(\1)/;
s/\./ /g
答案 1 :(得分:0)
您也可以轻松地在Awk中执行替换。如果要替换的单词始终是点分隔线上的最后五个标记,则可以执行类似
的操作echo "Trip.to.Washington.2004.08..." |
gawk -F . '{ for(i=1; i<=NF-5; ++i) printf "%s ", $i; print "(" $NF-4 ")" }'
我们将标记循环至少于NF
的五个标记,然后打印每个标记后跟一个空格。然后,我们打印下一个仍然留在一对括号内的那个,并且永远不会打印其余的。
因此,当i
为1时,我们会打印$1
,在这种情况下为Trip
,后跟空格。
当i
为2时,我们会打印$2
,在这种情况下为to
,然后再打印一个空格。
当我们到达Washington
时,循环结束,因为这是从结束开始计算的第五个字段。我们打印后跟一个空格,然后退出循环。
然后我们仍然打印出括号所围绕的第四个,这应该让我们成为年份。
-F .
是BEGIN { FS="." }
的缩写,但我为了简洁而做了这个改动;无论哪种方式都可以。
此处没有gawk
具体,因此您也可以使用通用awk
。