Linuxでは、各行を2倍に増やし、各行の数を異なるように変更する方法は?

Linuxでは、各行を2倍に増やし、各行の数を異なるように変更する方法は?

入力ファイルは次のとおりです。

1 0 0 000 3444
2 3 3 456 6875
3 0 0 023 3300
4 2 2 211 1000

まず、各行に2つのコピーが必要です。

1 0 0 000 3444
1 0 0 000 3444
2 3 3 456 6875
2 3 3 456 6875
3 0 0 023 3300
3 0 0 023 3300
4 2 2 211 1000
4 2 2 211 1000

2番目:各行の最初のコピーでは、3は2に変わり、4は1に変更し、各行の2番目のコピーでは3を1に変更し、4を2に変更する必要があります(最初の列は行名)と行番号は変更しないでください)。したがって、最終出力は次のようになります。

1 0 0 000 2111
1 0 0 000 1222
2 2 2 156 6875
2 1 1 256 6875
3 0 0 022 2200
3 0 0 021 1100
4 2 2 211 1000
4 2 2 211 1000

どんな提案がありますか?私はこれを試しましたが、うまくいきません。

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

答え1

各行を2倍にする方法:ねえ...
2番目の要求では、最初のフィールドと行全体を変数に保存し、最初の変更を実行し、最初のフィールドを初期値に設定して印刷し、行の内容を復元して2番目の変更を実行します。最初のフィールドをもう一度初期値に設定して印刷します。

awk '{t=$1;l=$0;gsub(/3/, "2");gsub(/4/, "1");$1=t;print}
{$0=l;gsub(/3/, "1");gsub(/4/, "2");$1=t;print}' infile

答え2

Perlには次の機能が組み込まれているので、この種の作業に非常に適しているようです。tr

$ perl -alne '
    @tmp=@F; 
    tr/34/21/ for @tmp[1..4]; print join " ", @tmp; 
    tr/34/12/ for @F[1..4]; print join " ", @F
  ' file
1 0 0 000 2111
1 0 0 000 1222
2 2 2 156 6875
2 1 1 256 6875
3 0 0 022 2200
3 0 0 021 1100
4 2 2 211 1000
4 2 2 211 1000

答え3

非常にエレガントではありませんが、GNUを使用すると可能ですsed

h              # save in hold
s_^[0-9]\{1,\} __ # remove first column
s_3_A_g        # change 3 and 4 to A and B
s_4_B_g
x              # swap with hold
s_ .*$__       # remove everything but first column
G              # append from hold
s_\n_ _        # join lines (with space)
h              # save in hold space again
s_A_2_g        # first output -> 2, 1
s_B_1_g
p              # print first line
g              # restore from hold 
s_A_1_g        # second output -> 1, 2
s_B_2_g
# end of script, second line printed automatically

これにより、最初の列が保存され(変更されていない)、残りの3と4がそれぞれAsとBに変更された行バージョンが作成されます。その後、この行は両方の出力に使用されます。まず2、合計を使用して1からその逆を使用します。

sed -f script.sed input > output

これは、入力内容に数字とスペースのみが含まれていると仮定します。AそしてBまだそこにありません。

関連情報