按行向文本文件添加变量文本

按行向文本文件添加变量文本

我有一个文本文件:

cat test1
ch140/121_------_T_201607061430
ch140/121_------_T_201611070840
ch140/121_------_T_201611071125
ch140/121_------_T_201611071235

我想逐行将此文本添加到此文件中:

/121_------_T_201607061430
/121_------_T_201611070840
/121_------_T_201611071125
/121_------_T_201611071235

结果必须是:

ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

我用了:

cat test1 | sed -e 's/ch140//' > test2
for a in $(cat test2)
do
????
done

我可以使用什么命令来实现这一点?
我尝试使用sed命令,但是没有用。

答案1

sed 's/\/121.*/&&/' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

解释

  • s/old/new/old用。。。来代替new
  • \/121.*匹配/121以及其后的内容
  • &&匹配的模式两次

您可以添加tee或使用重定向保存到新文件

sed 's/\/121.*/&&/' test1 | tee test2

答案2

paste命令的作用cat与并排命令相同。表示-d ''使用paste空分隔符,因此字符串之间没有任何内容。

$ paste -d '' test1 test2 
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

如果文件长度不一致,你可能需要看看这个问题以避免出现难看的结果。

答案3

您还可以使用awk

$ awk -F'/' -vOFS="/" '{print $0,$2}' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

这里我将输入 ( -F"/") 和输出 ( -vOFS="/") 字段分隔符设置为/。这意味着$2将是/第一个 之后直到下一个 的所有内容/。由于每行只有一个/$2是您要附加的文本。脚本将打印每一行 ( $0),然后附加第二个字段 ( $2)。

您也可以在 Perl 中使用相同的方法:

$ perl -F"/" -anle 'print "$_/$F[1]"' test1
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

或者,你可以使用与@Zanna 的sed回答

$ perl -pe 's#/.*#$&$&#' test1 
ch140/121_------_T_201607061430/121_------_T_201607061430
ch140/121_------_T_201611070840/121_------_T_201611070840
ch140/121_------_T_201611071125/121_------_T_201611071125
ch140/121_------_T_201611071235/121_------_T_201611071235

相关内容