
私のファイルの内容は以下のようになり、私の出力を以下のように変換したいと思います。
入力する
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
awk
2で始まるフィールドを使用して繰り返すことができます。
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,c
1行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