タブ区切りファイルの特定の列から複数のカンマを削除し、新しい行に単語を印刷します。

タブ区切りファイルの特定の列から複数のカンマを削除し、新しい行に単語を印刷します。

入力ファイル

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

awkOPで使用されるコマンドに構文の問題があるため、";ステートメントの終わりが印刷されます。

$ 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

おすすめ記事