复制每行,同时在 Gnu 中以不同方式更改行的每个副本中的某些值

复制每行,同时在 Gnu 中以不同方式更改行的每个副本中的某些值

我想让文件中的每一行重复两次,而在该行的第一个副本中,任何值 3 都将更改为 2,任何值 4 都将更改为 1。在每行的第二个副本中,任何值 3更改为 1,任何值 4 更改为 2。我知道为了重复,我可以使用 awk 命令:

awk '{for(i=0;i<1;i++)print}' input > output

但我不知道如何按照我解释的方式更改值

例如,每行重复 2 次:

1 000003444
2 334566875
3 000233300
4 222111000

变成:

1 000002111
1 000001222
2 221566875
2 112566875
3 000222200
3 000211100
4 222111000
4 222111000

答案1

awk

$ awk '
  { tmp = $2; gsub("3", "2", $2); gsub("4", "1", $2); print}
  { $2 = tmp; gsub("3", "1", $2); gsub("4", "2", $2); print}
' <file

答案2

Perl 方式:

$ perl -lane '$i=$F[1]; $F[1]=~s/3/2/g; $F[1]=~s/4/1/g; 
              $i=~s/3/1/g; $i=~s/4/2/g; print "$F[0] $F[1]\n$F[0] $i"' file 
1 000002111
1 000001222
2 221566875
2 112566875
3 000222200
3 000211100
4 222111000
4 222111000

首先,我们将当前行保存为$i,然后在当前行上进行所需的替换,然后$i最后打印当前行 ( $_) 和$i

相关内容