在Bash中出现5次逗号后,在文本文件中添加新行

时间:2018-05-10 16:24:07

标签: bash awk sed

我有一个文本文件,它基本上是文本文件中一行上的一个巨型excel文件。一个例子是这样的:

Name,Age,Year,Michael,27,2018,Carl,19,2018

我需要将逗号的第三次出现更改为新行,以便我得到

Name,Age,Year 
Michael,27,2018 
Carl,19,2018

请告诉我这是否太模糊,并且一如既往地感谢您提供所有帮助!

5 个答案:

答案 0 :(得分:2)

Gnu sed:

sed -E 's/(([^,]*,){2}[^,]*),/\1\n/g'

要更改每行的字段数,请将{2}更改为小于字段数的一个。例如,要更改每五个逗号(如问题的标题),您将使用:

sed -E 's/(([^,]*,){4}[^,]*),/\1\n/g'

在正则表达式中,[^,]*,为"除,以外的零个或多个字符后跟,;换句话说,它是一个以逗号分隔的字段。如果字段是带有内部逗号或换行符的字符串,则无法使用。

无论Linux man sed说什么,-E标志都是Posix sed的扩展,这会导致sed使用扩展正则表达式(ERE)而不是基本正则表达式(参见man 7 regex)。 -E也适用于BSD sed,默认情况下在Mac OS X上使用。(感谢@EdMorton提供的说明。)

答案 1 :(得分:1)

使用GNU awk进行多字符RS:

$ awk -v RS='[,\n]' '{ORS=(NR%3 ? "," : "\n")} 1' file
Name,Age,Year
Michael,27,2018
Carl,19,2018

任何awk:

$ awk -v RS=',' '{sub(/\n$/,""); ORS=(NR%3 ? "," : "\n")} 1' file
Name,Age,Year
Michael,27,2018
Carl,19,2018

答案 2 :(得分:0)

试试这个

$ cat /tmp/22.txt
Name,Age,Year,Michael,27,2018,Carl,19,2018,Nooka,35,1945,Name1,11,19811

$ echo "Name,Age,Year"; grep -o "[a-zA-Z][a-zA-Z0-9]*,[1-9][0-9]*,[1-9][0-9]\{3\}" /tmp/22.txt
Michael,27,2018
Carl,19,2018
Nooka,35,1945
Name1,11,1981

或者,[1-9][0-9]\{3\}如果你不想再为{YYYY部分'放置[0-9] 3次。

PS :此解决方案只会为您提供一年中的YYYY(即使YYYY的数据为19811(错字错误,如果有的话),您仍然会得到{{1 }}

答案 3 :(得分:0)

您正在寻找3个片段,每个片段没有逗号并用逗号分隔。 最后的字段可以给出问题(不是用逗号结尾,而只有两个字段。) 下一个命令看起来很好。

grep -Eo "([^,]*[,]{0,1}){0,3}" inputfile

答案 4 :(得分:0)

这可能适合你(GNU sed):

sed 's/,/\n/3;P;D' file

用换行符替换每三分之一,,打印,删除第一行并重复。