配列にAWKを使用する

配列にAWKを使用する

次のような単一の地域と、さまざまな数の都市/町を含むデータ ファイルがあります。

South,London,Guildford,Winchester
North,Manchester,Leeds
East,Norwich

AWKを使用してこのような出力を生成する必要があります

South,London
South,Guildford,
South,Winchester
North,Manchester etc

都市/町が存在する場合にのみループする必要があります。

答え1

$ awk -F ',' 'BEGIN { OFS=FS } { for (i=2; i<=NF; ++i) print $1, $i }' file
South,London
South,Guildford
South,Winchester
North,Manchester
North,Leeds
East,Norwich

プログラムawkは、フィールド 2 以降、各行のカンマ区切りのフィールドを単純にループし、各フィールドを同じ行の最初のフィールドと一緒に出力します。

ブロックBEGINは、出力フィールド区切り文字を入力フィールド区切り文字と同じに設定するだけです。

これは、入力データが「単純な CSV」形式、つまりカンマ区切りで、どのフィールドにもカンマや改行が埋め込まれていない場合に機能します。

答え2

私は以下の方法を試しましたが、うまくいきました

line_count=`awk '{print NR}' p.txt | sort -rn| sed -n '1p'`

for ((i=1;i<=$line_count;i++)); do No_of_columns=`awk -v i="$i" -F "," 'NR==i{print NF}' p.txt`; value=`awk -v i="$i" -F "," 'NR==i{print $1}' p.txt`;  colum_count=`awk -v i="$i" -F "," 'NR==i {print NF}' p.txt`; for ((d=2;d<=$colum_count;d++)); do awk -v i="$i" -v value="$value" -v d="$d" -F ","  'NR==i{print value","$d}' p.txt; done; done

出力

South,London
South,Guildford
South,Winchester
North,Manchester
North,Leeds
East,Norwich

関連情報