Bash Shell命令,用于在一行逗号分隔的字符串的每n个元素中插入一个换行符
我有一个包含很多元素的单行csv。现在,我想在bash/shell脚本中的每个第n个元素后面插入一个换行符 另外:我想在前面加一行描述符,并将描述符的计数设为“n” 例如:Bash Shell命令,用于在一行逗号分隔的字符串的每n个元素中插入一个换行符,bash,shell,csv,Bash,Shell,Csv,我有一个包含很多元素的单行csv。现在,我想在bash/shell脚本中的每个第n个元素后面插入一个换行符 另外:我想在前面加一行描述符,并将描述符的计数设为“n” 例如: "4908041eee3d4bf98e606140b21ebc89.16","7.38974601030349731","45.31298584267982221","94ff11ce7eb54642b0768dde313e8b25.16","7.38845318555831909","45.3142532032594971
"4908041eee3d4bf98e606140b21ebc89.16","7.38974601030349731","45.31298584267982221","94ff11ce7eb54642b0768dde313e8b25.16","7.38845318555831909","45.31425320325949713", (...)
进入
编辑:我进行了第一次尝试,但逗号分隔符丢失:
(...) | xargs --delimiter=',' -n3
"4908041eee3d4bf98e606140b21ebc89.16" "7.38974601030349731" "45.31298584267982221"
"94ff11ce7eb54642b0768dde313e8b25.16" "7.38845318555831909" "45.31425320325949713"
正在尝试将“”替换为“,”
注意:此解决方案的区别在于它从标题行中的列数导出输出列数
假设CSV输入中的字段没有嵌入的,
实例(在这种情况下,您需要一个合适的CSV解析器),请尝试awk
:
awk -v RS=, -v header='"id","lon","lat"' '
BEGIN {
print header
colCount = 1 + gsub(",", ",", header)
}
{
ORS = NR % colCount == 0 ? "\n" : ","
print
}
' file.csv
请注意,如果输入文件以换行符结尾(这是典型的情况),则在输出后面会有一个额外的换行符
使用GNU Awk或Mawk(但不支持BSD/OSX Awk,它只支持文字、单字符RS
值),您可以按如下方式修复此问题:
awk -v RS='[,\n]' -v header='"id","lon","lat"' '
BEGIN {
print header
colCount = 1 + gsub(",", ",", header)
}
{
ORS = NR % colCount == 0 ? "\n" : ","
print
}
' file.csv
BSD/OSX Awk解决方案:坚持使用
-vrs=,
并用替换file.csv
,我会选择Perl
让我们假设这输出类似于您的文件:
printf "1,2,3,4,5,6,7,8,9,10"
1,2,3,4,5,6,7,8,9,10
如果您希望每四个逗号都被替换,则可以使用此选项:
printf "1,2,3,4,5,6,7,8,9,10" | perl -pe 's{,}{++$n % 4 ? $& : "\n"}ge'
1,2,3,4
5,6,7,8
9,10
假设您的输入文件名为input
,则输入文件名为data.txt:
echo id,lon,lat; awk '{ORS=NR%3?",":"\n"}1' RS=, input
向我们展示您的尝试。| xargs--delimiter=','-n3但这会删除逗号编辑您的帖子并添加命令和您获得的输出,以便您可以获得调试/修复帮助您声明要“插入新行”,但从您的示例中可以看出,您实际上希望用新行替换每三个逗号。精确地指定一个问题通常可以帮助您找到解决方案。感谢所有人提供各种各样的“全工作”解决方案。++感谢修复OP解决方案尝试的实用解决方案;一般警告:只有在输入字段没有嵌入空格的情况下才有效(这显然适用于OP的数据)
printf "1,2,3,4,5,6,7,8,9,10" | perl -pe 's{,}{++$n % 4 ? $& : "\n"}ge'
1,2,3,4
5,6,7,8
9,10
cat data.txt | xargs -n 3 -d, | sed 's/ /,/g'
echo id,lon,lat; awk '{ORS=NR%3?",":"\n"}1' RS=, input