首页 > 解决方案 > awk:根据两列的连接值添加新列

问题描述

我正在尝试根据两列的连接值将新列添加到文本文件中。值被插入到中间而不是字符串的末尾。

我正在使用 awk。这是两个示例行

$ head -1 file.txt

8502CC169154|02|GA|TN|89840|9|2008-11-15 00:00:00.000|2009-11-15 00:00:00.000|1|TEAM1|1639009|1000000|0|2008-11-15 00:00:00.000|2009-11-15 00:00:00.000|85|00|37421||241|20|331|1052A|5000|0|.1500|Chattanooga|47065|.000|025|35|25000|0|0|0|0|0|718||E|-17.00|-17.00|-17.00|-17.00|-17.00|-2.55|-2.55|-2.55|-2.55|D|C9N7I4115531902|-2.19|-2.19|-2.19|-2.19|-14.81|051|2008-12-31 00:00:00.000|151|2008-12-17 00:00:00.000|||AC|CC|Y||2008-12-31 00:00:00.000|.000000|A|.000000|.000000|.000000|Y|8502CC169154-8|8502CC169154|8|||122130|122130M|7764298|RA

我尝试了以下。

$ head -1 file.txt | awk -F'|' '{$(NF+1)=$1"-"$6;}1' OFS='|'

我期待在字符串末尾有一个新列。但是您可以看到连接字段被插入到字符串的中间而不是字符串的末尾。

8502CC169154|02|GA|TN|89840|9|2008-11-15 00:00:00.000|2009-11-15 00:00:00.000|1|TEAM1|1639009|1000000|0|2008-11-15 00:00:00.000|2009-11-15 00:00:00.000|85|00|37421||241|20|331|1052A|5000|0|.1500|Chattanooga|47065|.000|025|35|25000|0|0|0|0|0|718||E|-17.00|-17.00|-17.00|-17.00|-17.00|-2.55|-2.55|-2.55|-2.55|D|C9N7I4115531902|-2.19|-2.19|-2.19|-2.19|-14.81|051|2008-12-31 00:00:00.000|151|2008|8502CC169154-9.000|||AC|CC|Y||2008-12-31 00:00:00.000|.000000|A|.000000|.000000|.000000|Y|8502CC169154-8|8502CC169154|8|||122130|122130M|7764298|RA

标签: awk

解决方案


您的原始代码使用 GNU awk 对我有用,但我怀疑并非所有 awk 都支持设置$(NF+1)。为避免这种情况,请尝试:

head -1 file.txt | awk -F'|' '{$0=$0 FS $1"-"$6;}1' OFS='|'

awk 是一种令人惊讶的强大语言,它拥有所有的功能head,使得管道变得不必要。因此,为了提高效率,请尝试以下简单命令:

awk -F'|' '{print $0 FS $1"-"$6; exit}' file.txt

这个怎么运作:

  • -F'|'

    这会将字段分隔符设置为竖线。

  • print $0 FS $1"-"$6

    这将打印您想要的输出行,该行由原始行 ,$0后跟字段分隔符 ,FS以及第一个字段、破折号和第六个字段的组合组成。

  • exit

    打印第一行后,这告诉 awk 退出。这消除了对head -1.


推荐阅读