【问题标题】:Trying to get single line output from awk getline + variable试图从 awk getline + 变量中获取单行输出
【发布时间】:2021-03-05 00:57:43
【问题描述】:

文件 1 有制表符分隔的内容:

09/11/1983  so and so <bob@bob.com>     content of my imp. msg
09/12/1983  yo yo yoooo <politics@me.com>   content of my imp. msg

文件 2 有空格分隔的内容:

bob@bob.com 7155
politics@me.com 2666

我正在使用以下 awk 命令创建一个新文件,该文件将文件 2 中每一行的数字添加为文件 1 中每一行末尾的新制表符分隔数据。

awk 'BEGIN {ORS="\t"} {getline f1 <"c:\\file1.tsv" ; print f1 $2}' < "c:\\file2.tsv" > "c:\\file3.tsv" 

但是,输出将数字添加为新行,如下所示:

09/11/1983  so and so <bob@bob.com> content of my imp. msg  
7155
09/12/1983  yo yo yoooo <politics@me.com>   content of my imp. msg  
2666

我已阅读有关 awk ORS 并尝试了许多建议解决方案的组合,但无法使输出看起来像这样:

09/11/1983  so and so <bob@bob.com> content of my imp. msg  7155
09/12/1983  yo yo yoooo <politics@me.com>   content of my imp. msg  2666

提前感谢您在解决方案方面的任何帮助。

【问题讨论】:

  • 您使用的是 Windows 还是 Unix?如果您在 Windows 上,那么我很惊讶在脚本周围使用单引号可以正常工作,但如果您在 Unix 上,那么我很惊讶使用 c:\\... 引用文件可以正常工作。
  • 如果是 windows 文件,请尝试dos2unix file1 file2 并重新运行。否则getline f1 &lt;"c:\\file1.tsv" ; sub("/n","",f1);print f1 $2}' 可能会有所帮助。抱歉,没时间测试。祝你好运。
  • 我在 Windows10 上,但使用 cygwin64 作为模拟器。我运行了awk '{getline f1 &lt;"c:\\file1.tsv" ; sub("/n","",f1) ; print f1 $2}' &lt; "c:\\file2.tsv" &gt; "c:\\file3,但输出继续将文件 2 中的数字添加为文件 3 中的新行。感谢您的指导。
  • 先对原始数据文件运行dos2unix命令,再运行awk命令即可解决问题!啊,谢谢!
  • Arg,昨晚深夜输入了我的建议。在没有sub().. 的情况下尝试它,因为它应该是sub("\n","",f1),但是一旦你完成了dos2unix,它可能并不重要。祝你好运。

标签: awk concatenation getline


【解决方案1】:

因为你没有匹配到相应的行,所以粘贴

$ paste file1 <(cut -d' ' -f2 file2)

09/11/1983  so and so <bob@bob.com>     content of my imp. msg  7155
09/12/1983  yo yo yoooo <politics@me.com>   content of my imp. msg      2666

【讨论】:

  • 感谢您抽出宝贵时间帮助我。运行此命令将文件 2 中的数据放在文件 1 的第 1 列中,而不是作为新列放在末尾。我会玩一下,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多