我有一个文本文件,它基本上是文本文件中一行上的一个巨型excel文件。一个例子是这样的:
Name,Age,Year,Michael,27,2018,Carl,19,2018
我需要将逗号的第三次出现更改为新行,以便我得到
Name,Age,Year
Michael,27,2018
Carl,19,2018
请告诉我这是否太模糊,并且一如既往地感谢您提供所有帮助!
答案 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
用换行符替换每三分之一,
,打印,删除第一行并重复。