シェルコマンドを使用して各行をコピーする方法は?

シェルコマンドを使用して各行をコピーする方法は?

次のような多くのデータがあります。

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
....

シェルコマンドを使用してこれをどのように達成できますか?

答え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

したがって、デフォルトでは、2番目のフィールドの後に別のサフィックスを使用して各行を4回繰り返したいですか?

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

これは行をそのまま印刷します。最初のコマンドはp2番目のカンマの前にs追加し、_12番目と3番目はandsで置き換え、2番目のコマンドは行を印刷するためにフラグを付け、最後のバージョンはデフォルトで印刷します。_2_3p

質問を展開して修正

与えられた反復回数だけ繰り返すには、次のようにします。

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

最後から2123番目の行は最大インデックスです。今は説明する時間がありませんが、どうしたのか理解したい場合は後で説明します。

答え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に保存します。
  • 2番目のカンマが見つかった$ lの変更内容を現在のレコードに繰り返し追加します。

関連情報