
入力ファイル
jayesh 30,20,50,60 30:20:40,60:55 A AB,KL,CD SM1,SM2
rahul 10,80,50,90 25:55:60,25 SGF AAAA,BCD,RTY SM3,SM4,SM4
pravin 89,78,40,20 25:30:55,96:25 M J SD10,SD12
sarika 10,20,48 29:50:30,25 T K,L SD20,SD39
5番目の列からカンマを削除し、新しい行にカンマの後の単語を印刷したいと思います。 (注: - 5番目の列の各セルには多くのカンマが含まれていますが、数個しか表示されていません。)
期待される出力
jayesh 30,20,50,60 30:20:40,60:55 A AB SM1,SM2
jayesh 30,20,50,60 30:20:40,60:55 A KL SM1,SM2
jayesh 30,20,50,60 30:20:40,60:55 A CD SM1,SM2
rahul 10,80,50,90,120 25:55:60,25 SGF AAAA SM3,SM4,SM4
rahul 10,80,50,90,120 25:55:60,25 SGF BCD SM3,SM4,SM4
rahul 10,80,50,90,120 25:55:60,25 SGF RTY SM3,SM4,SM4
pravin 89,78,40,20 25:30:55,96:25 M J SD10,SD12
sarika 10,20,48 29:50:30,25 T K SD20,SD39
sarika 10,20,48 29:50:30,25 T L SD20,SD39
awkを使って以下を試しましたが、期待した結果が得られませんでした。 (コードを書くためにこのウェブサイトの助けを受けました。カンマを削除し、カンマの後の完全な単語行を再印刷する方法)
awk '{
split ($5,w5,",");
for (i in w5)
{ print $1"\t"$2"\t"$3"\t"$4"\t"w5[i]"\t"$6";}}'
@sundeep、入力ファイルで次のコマンドを試みると、列5と6が混在します。 (ここには合計6つの列しか表示されていませんが、私のファイルには6つ以上の列があります。)
Excelで出力ファイルを開くと、次の出力が表示されます。
出力
$ awk '{ split ($5,w5,","); for (i in w5) { print $1"\t"$2"\t"$3"\t"$4"\t"w5[i]"\t"$6 } }' ip.txt
jayesh 30,20,50,60 30:20:40,60:55 A "ABSM1,SM2"
jayesh 30,20,50,60 30:20:40,60:55 A KL SM1,SM2
jayesh 30,20,50,60 30:20:40,60:55 A CD" SM1,SM2
rahul 10,80,50,90 25:55:60,25 SGF AAAASM3,SM4,SM4"
rahul 10,80,50,90 25:55:60,25 SGF BCD SM3,SM4,SM4
rahul 10,80,50,90 25:55:60,25 SGF RTY" SM3,SM4,SM4
pravin 89,78,40,20 25:30:55,96:25 M J SD10,SD12
sarika 10,20,48 29:50:30,25 T KSD20,SD39"
sarika 10,20,48 29:50:30,25 T L" SD20,SD39
答え1
awk
OPで使用されるコマンドに構文の問題があるため、";
ステートメントの終わりが印刷されます。
$ awk '{ split ($5,w5,","); for (i in w5) { print $1"\t"$2"\t"$3"\t"$4"\t"w5[i]"\t"$6 } }' ip.txt
jayesh 30,20,50,60 30:20:40,60:55 A AB SM1,SM2
jayesh 30,20,50,60 30:20:40,60:55 A KL SM1,SM2
jayesh 30,20,50,60 30:20:40,60:55 A CD SM1,SM2
rahul 10,80,50,90 25:55:60,25 SGF AAAA SM3,SM4,SM4
rahul 10,80,50,90 25:55:60,25 SGF BCD SM3,SM4,SM4
rahul 10,80,50,90 25:55:60,25 SGF RTY SM3,SM4,SM4
pravin 89,78,40,20 25:30:55,96:25 M J SD10,SD12
sarika 10,20,48 29:50:30,25 T K SD20,SD39
sarika 10,20,48 29:50:30,25 T L SD20,SD39
また、提案の@fedorquiのおかげで、よりきれいな構文のために出力フィールドの区切り文字を設定できます。
awk -v OFS='\t' '{ split ($5,w5,","); for (i in w5) { print $1,$2,$3,$4,w5[i],$6 } }' ip.txt
または
awk -v OFS='\t' '{ split ($5,w5,","); for (i in w5) { $5 = w5[i]; print } }' ip.txt
同様のソリューションperl
$ perl -lane 'print join "\t", @F[0..3],$_,@F[5..$#F] foreach split /,/,$F[4]' ip.txt
jayesh 30,20,50,60 30:20:40,60:55 A AB SM1,SM2
jayesh 30,20,50,60 30:20:40,60:55 A KL SM1,SM2
jayesh 30,20,50,60 30:20:40,60:55 A CD SM1,SM2
rahul 10,80,50,90 25:55:60,25 SGF AAAA SM3,SM4,SM4
rahul 10,80,50,90 25:55:60,25 SGF BCD SM3,SM4,SM4
rahul 10,80,50,90 25:55:60,25 SGF RTY SM3,SM4,SM4
pravin 89,78,40,20 25:30:55,96:25 M J SD10,SD12
sarika 10,20,48 29:50:30,25 T K SD20,SD39
sarika 10,20,48 29:50:30,25 T L SD20,SD39