Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Shell命令,用于在一行逗号分隔的字符串的每n个元素中插入一个换行符_Bash_Shell_Csv - Fatal编程技术网

Bash Shell命令,用于在一行逗号分隔的字符串的每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

我有一个包含很多元素的单行csv。现在,我想在bash/shell脚本中的每个第n个元素后面插入一个换行符

另外:我想在前面加一行描述符,并将描述符的计数设为“n”

例如:

"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