从文件中提取文本并在unix中的每行末尾附加内容

时间:2018-02-02 12:19:38

标签: linux bash unix

我想在.txt文件中执行以下操作。 file.txt的内容是:

w|x|y|z
w1|x1|y1|z1
w2|x2|y2|z2

必填结果:

w|x|y|z|w_x
w1|x1|y1|z1|w1_x1
w2|x2|y2|z2|w2_x2

我希望在每行的末尾添加前两个管道分隔的单词,并在同一文件中添加下划线(_)。

3 个答案:

答案 0 :(得分:4)

您可以使用sed:

perl -plaF'/\|/' -e '$_ .= "|$F[0]_$F[1]"' -- file.txt

或Perl:

-p
  • -l逐行读取输入并打印输出
  • -a从输入中删除换行符并将其添加到输出
  • -F将输入拆分为@F数组
  • -a指定Compact blob store
  • 的分隔符

答案 1 :(得分:1)

perl和(gnu)sed的“优点”是它们提供了一个用输出覆盖文件的选项,这似乎是OP的愿望。缺点是它们提供了这样的选项,防止用户认识到这样的东西不是Unix Way TM。使用awk执行此操作,并使用shell根据需要重定向输出(例如,写入临时文件并根据需要移动它)。

awk '{print $0,$1 "_" $2}' OFS=\|  FS=\| file.txt

答案 2 :(得分:1)

使用纯粹的bash文本处理简单命令:

cut -d '|' -f 1,2 --output-delimiter='_' t.txt | paste -d '|' t.txt -

如果您的数据位于t.txt文件中。

说明:

  • 第一部分(cut)从文件中获取第一列和第二列,并将它们与' _'连接起来。 (输出分隔符)
  • paste使用' |'将原始文件与上一个命令的输出一行一行地连接起来。分隔符(通知-标记,用作从cut命令的管道数据中获取的标准输入)