如何使用 shell 命令复制每一行?

如何使用 shell 命令复制每一行?

我有一堆数据如下。

1,A9600,001_DIF,NA,TIME,startTime    
2,A9600,002_DEP,NA,TIME,startTime
3,A9600,003_LIT,NA,TIME,startTime
4,A9600,004_ETC,NA,TIME,startTime
5,B9600,005_CMP,NA,TIME,startTime
6,B9600,006_IMP,NA,TIME,startTime
7,B9600,007_DIF,NA,TIME,startTime

我希望将它们修改如下。

1,A9600,001_DIF,NA,TIME,startTime
1,A9600_1,001_DIF,NA,TIME,startTime
1,A9600_2,001_DIF,NA,TIME,startTime
1,A9600_3,001_DIF,NA,TIME,startTime  
2,A9600,002_DEP,NA,TIME,startTime
2,A9600_1,002_DEP,NA,TIME,startTime
2,A9600_2,002_DEP,NA,TIME,startTime
2,A9600_3,002_DEP,NA,TIME,startTime
....

如何使用 shell 命令实现这一点?

答案1

一个简单的 awk 循环

awk -v num=3 'BEGIN {OFS=FS=","} 
  {tmp=$2; print; for (i=1;i<=num;i++) {$2=tmp"_"i; print}}
  ' file

num根据需要进行调整。

答案2

所以本质上,您想在第二个字段之后使用不同的后缀将每行重复四次?

sed 'p;s/,/_1,/2p;s/_1/_2/p;s/_2/_3/' file

这是p按原样打印该行;第一个命令在第二个逗号之前s添加并打印;_1第二个和第三个s替换为_2_3,第二个佩戴p标志来打印该行,而最后一个版本则默认打印。

扩展问题后编辑

如果你想循环给定的迭代次数,你可以这样做

sed 'p;s/,/_1,/2p;G;s/$/0123456789+/;:a
s/\(_[0-9]*\)\([0-9]\)\(,.*\n.*\2\)\(.\)/\1\4\3\4/
s/_+/_10/;s/\(_[0-9]*\)\([0-9]\)+\(.*\n.*\2\)\(.\)/\1\40\3\2\4/
/_+/!P
/_123,/! ta
d' file

其中123倒数第二行是最大索引。目前我没有时间解释,但如果你想了解发生了什么,我可以稍后再解释。

答案3

perl -pse '$l = $_;
   for my $k ( 1 .. $N ) { s/\z/$l =~ s|^[^,]+,[^,]+\K|_$k|r/e }
' -- -N=3 -- Input.data

在职的

  • -p选项设置隐式文件循环读取+自动打印记录。
  • -s在我们的例子中,允许从命令行设置变量$N。 YMMV。
  • 将当前记录保存到$l中。
  • 我们循环并将在找到第二个逗号的位置修改的 $l 内容附加到当前记录中。

相关内容