我有一个文件,它是一个简单的音乐播放列表,但数据如下
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
的换行符,然后使用 打印结果:sed
y
p
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)