如何使用gawk和sed格式化包含日期的标题?

时间:2016-10-17 20:06:50

标签: bash date sed title gawk

我对我有所了解,并且我希望格式化以下文字:

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中正确使用这个陈述的线索。

2 个答案:

答案 0 :(得分:0)

使用sed

$ sed 's/\([0-9]\{4\}\).*/(\1)/; s/\./ /g' foo
Trip to Washington (2004)
Florida (1993)
Aunt Rose (2011)

说明:

  • 首先使用反向引用围绕4位数字及其后面的所有内容使用括号: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