最初のフィールドに基づいてファイル行を分割する

最初のフィールドに基づいてファイル行を分割する

私のファイルの内容は以下のようになり、私の出力を以下のように変換したいと思います。

  • 入力する

    1,a,b,c
    2,b,c
    3,e,f
    4,l
    
  • 希望の出力

    1,a
    1,b
    1,c
    2,b
    2,c
    3,e
    3,f
    4,l
    

最初のフィールドの値は一意であり、入力の最初のフィールドに重複した行はありません。

私はスクリプトに初めてアクセスし、これをどのように実行できるかわかりません。

答え1

awk2で始まるフィールドを使用して繰り返すことができます。

awk -F, '{ OFS=FS; for (i=2;i<=NF;i++) print $1,$i }' file

出力:

1,a
1,b
1,c
2,b
2,c
3,e
3,f
4,l

答え2

それでsedあなたはします

sed -E 's/([^,]*,)([^,]*),/\1\2\n\1/;P;D' file

\n代替文字列での使用はGNUでのみ機能しますsed。他のシステムでは、バックスラッシュの前に実際の改行を使用する必要があります。

sed -E 's/([^,]*,)([^,]*),/\1\2\
\1/;P;D' file
  • -E()読みやすくするために使用できる拡張正規表現を意味します\(\)
  • [^,]*カンマなしで文字列と一致するため、フィールドと一致します。
  • したがって、[^,]*,[^,]*,最初の2つのフィールドが一致します。()交換時に\1再利用できるようにフィールドを周りに配置しました。\2
  • このsコマンドは、最初の2つのフィールドを独自のフィールドに置き換え、改行文字を追加し、新しい行の最初のフィールドを繰り返します。したがって、線は2つの部分に分けられます。1,a,b,c1行1,aと別の行1,b,c
  • これでP、バッファの最初の行を印刷します(印刷する準備ができていることを知っています)。
  • Dバッファから最初の行を削除し、削除後にバッファに残っているものがある場合は、スクリプトを再起動してください。したがって、残りは1,b,c再び合計行1,bに分割されます1,c
  • 1つしか残っていない場合は、x,yパターンが一致しなくなるため、改行は挿入されず、繰り返されませんが、次の行sedで続行されます。

答え3

ミラーの使用(https://github.com/johnkerl/miller)

mlr --c2n --ofs "," --implicit-csv-header then reshape -r "[^1]" -o item,value then cut -x -f item input.txt

あなたは出力を得るでしょう

1,a
1,b
1,c
2,b
2,c
3,e
3,f
4,l

答え4

次のコマンドを試してください。素晴らしい作品。

count_line=`awk '{print NR}' p.txt| sort -nr| sed -n '1p'`
for((i=1;i<=$count_line;i++)); do j=`awk -v i="$i" -F "," 'NR==i{print $1}' p.txt`;k=`awk -v i="$i" -F "," 'NR==i{print NF}' p.txt`; for ((z=2;z<=$k;z++)); do awk -v i="$i" -v j="$j" -v z="$z" -F "," 'NR==i{print j","$z}' p.txt; done; done

出力

1,a
1,b
1,c
2,b
2,c
3,e
3,f
4,l

関連情報