簡単な音楽プレイリストファイルがありますが、データは次のとおりです。
Song
Artist
Album
Date Song was added to playlist (mm/dd/yyyy)
Song Duration (mm:ss)
私がしたいのは、曲とアーティストを1行に入れて、それを新しいcsvファイル(music.csvと仮定)にエクスポートすることです。
だから
Song,Artist
Song,Artist
その他など
n行目ごとに印刷する方法を知っていますが、n行目ごとに+他の行を印刷することはできません。
答え1
awk '
NR % 5 == 1 {printf "%s,", $0}
NR % 5 == 2
' file
答え2
GNUを使用すると、sed
5行の最初の行を予約済みスペースに配置できます1~5h
。次に、次をH
使用して、予約済みg
スペースに5行ごとに2行を追加できます。sed
y
p
sed -n -e '1~5h' -e '2~5 { H; g; y/\n/,/; p; }' file
paste
を使用して、5行の各セットを単一のタブ区切りレコードにフォーマットし、を使用して各レコードの最初と2番目のフィールドを抽出し、次を使用して区切りcut
タブ文字をコンマに置き換えることができますtr
。
paste - - - - - < file | cut -f 1,2 | tr '\t' ','
または、ソングフィールドとアーティストフィールドの両方にカンマが含まれていない場合
paste -d, - - - - - < file | cut -d, -f 1,2
上記のように、各5行セットをタブ区切りの1行レコードに変換し、CSV対応Millerツールを使用して各レコードから最初の2つのフィールドを抽出してCSVを出力します。
paste - - - - - < file | mlr --itsv --ocsv -N cut -f 1,2
これに対する追加の利点は、挿入されたコンマまたは引用符を含むすべての出力フィールドを自動的に引用することができ、CSV認識パーサーがデータを正しく読み取ることができることです。
答え3
sed
これは、線を抽出してpaste
その組み合わせを連結することで比較的簡単に行うことができます。
$ seq 20 | sed -n 'p;n;p;n;n;n' | paste -d, - -
1,2
6,7
11,12
16,17
答え4
awkを使用してください。
$ awk -v RS= -F'\n' -v OFS=',' '{print $1,$2}' file
Song,Artist
Song,Artist
上記の推測入力のレコードは、1つ以上の空行に分かれています。たとえば、次のようになります。
$ cat file
Song
Artist
Album
Date Song was added to playlist (mm/dd/yyyy)
Song Duration (mm:ss)
Song
Artist
Album
Date Song was added to playlist (mm/dd/yyyy)
Song Duration (mm:ss)
しかし、これは単なる推測です。あなたの例では、1つの入力レコードしか提供していないため、レコードを分割する方法を示していません。
または、レコード間に空白行やその他の区切り文字がなく、5行ブロックだけの場合は、次のものが必要です。
$ awk -v OFS=',' '{a[n=NR%5]=$0} !n{print a[1],a[2]}' file
Song,Artist
Song,Artist
2番目のスクリプトは、次の入力を想定しています。
$ cat file
Song
Artist
Album
Date Song was added to playlist (mm/dd/yyyy)
Song Duration (mm:ss)
Song
Artist
Album
Date Song was added to playlist (mm/dd/yyyy)
Song Duration (mm:ss)