awkを使用してテーブル形式を変更する

awkを使用してテーブル形式を変更する

以下のように非常に長いテーブルをたくさん再フォーマットする必要があります。

オリジナルフォーマット:

John Smith,Jones,Taylor
Janet Williams,Brown,Wilson

必須形式:

John Smith
John Jones
John Taylor
Janet Williams
Janet Brown
Janet Wilson

どうすればいいですか?

答え1

そしてawk

awk -F"[ ,]" '{for(i=2;i<=NF;i++){print $1,$i;}}' file
  • -F"[ ,]": 区切り文字はスペースとカンマで設定されます。$1名前に姓を追加し、$2最後のフィールドに姓を追加しました。
  • for(i=2;i<=NF;i++):フィールド2から始めて各フィールドを繰り返します。
    • print $1,$i;:氏名を記載してから姓を記入してください。

出力:

John Smith
John Jones
John Taylor
Janet Williams
Janet Brown
Janet Wilson

答え2

努力する

awk ' { n=split($2,A,",") ;
    for (i=1;i<=n;i++) printf "%s %s\n",$1,A[i] ;
} ' file

どこ

  • split($2,A,",")2番目のフィールドはカンマ(、)で区切られています。
  • n= 計算できる
  • for( )繰り返す
  • A[i]現在の名前(または姓)です。
  • printf "%s %s\n",$1,A[i]一緒に印刷してください。

答え3

そしてsed:

sed ':1;s/,/\n/;T;P;s/\S*\n//;t1' file
  • :1戻りポイントの表示
  • s/,/\n/ sn最初のカンマを ewline に置き換えます。
  • T置き換えが行われていない場合(行にカンマがなくなった場合)、スクリプトの最後に渡されます。
  • Pn最初から最後まで行を印刷
  • s/\S*\n//\S*ewlineを使用して単語(空でない記号)を削除します。n
  • t1交換が成功した場合 - 戻り1ポイント

以上POSIX'リー

sed ':1;s/,/\n/;/\n/P;s/\S*\n//;t1' file

関連情報