ファイルから1行目と5行目を抽出し、awkでカンマで区切って1行に入れます。

ファイルから1行目と5行目を抽出し、awkでカンマで区切って1行に入れます。

簡単な音楽プレイリストファイルがありますが、データは次のとおりです。

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を使用すると、sed5行の最初の行を予約済みスペースに配置できます1~5h。次に、次をH使用して、予約済みgスペースに5行ごとに2行を追加できます。sedyp

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)

関連情報