从文件中提取第一行和第五行并将它们放在一行上,用 awk 逗号分隔

从文件中提取第一行和第五行并将它们放在一行上,用 awk 逗号分隔

我有一个文件,它是一个简单的音乐播放列表,但数据如下

Song
Artist
Album
Date Song was added to playlist (mm/dd/yyyy)
Song Duration (mm:ss)

我想做的只是将歌曲和艺术家放在一行上并将它们导出到一个新的 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。然后,您可以使用 将每 5 行的第 2 行附加到保留空间H,使用 将整个保留空间放入缓冲区,使用命令替换分隔两行g的换行符,然后使用 打印结果:sedyp

sed -n -e '1~5h' -e '2~5 { H; g; y/\n/,/; p; }' file

您可以使用paste, 将每组五行格式化为单个制表符分隔的记录,使用cut提取每个记录的第一个和第二个字段,然后使用以下方法将分隔制表符替换为逗号tr

paste - - - - - < file | cut -f 1,2 | tr '\t' ','

或者,如果歌曲和艺术家字段都不包含逗号,

paste -d, - - - - - < file | cut -d, -f 1,2

如上所述,将每组五行转换为单行制表符分隔记录,然后使用支持 CSV 的 Miller 工具从每条记录中提取前两个字段并输出 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

第二个脚本假定此输入:

$ 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)

相关内容