InputFile:
filed1 field2 field3 field4 field5 field6 field7 field8 field9 field10 field11 field12
我需要将field3,field6,field9之后的空格替换为换行符。 我尝试了下面的sed命令并且它工作正常,但我正在寻找一个更优化的解决方案,以便处理具有更多字段的输入文件。
sed -e 's/ /\
/3' -e 's/ /\
/6' -e 's/ /\
/9' InputFile
提前致谢。
答案 0 :(得分:2)
使用grep
echo "filed1 field2 field3 field4 field5 field6 field7 field8 field9 field10 field11 field12" | grep -oE '([^ ]+ *){3}'
将产生输出
filed1 field2 field3
field4 field5 field6
field7 field8 field9
field10 field11 field12
使用sed
echo "filed1 field2 field3 field4 field5 field6 field7 field8 field9 field10 field11 field12" | sed -r 's/(([^ ]+ *){3})/\1\n/g'
将产生输出
filed1 field2 field3
field4 field5 field6
field7 field8 field9
field10 field11 field12
/(([^ ]+ *){3}
匹配除空格之外的任何内容,后跟空格3
次,有效地选择3个字段。
echo "filed1 field2 field3 field4 field5 field6 field7 field8 field9 field10 field11 field12" | awk '{for(i=1;i<NF;i+=3) print $i, $(i+1), $(i+2)}'
将输出
filed1 field2 field3
field4 field5 field6
field7 field8 field9
field10 field11 field12
Throgh basic sed,
$ echo "filed1 field2 field3 field4 field5 field6 field7 field8 field9 field10 field11 field12" | sed 's/\(\([^ ]\+ \)\{3\}\)/\1\n/g'
filed1 field2 field3
field4 field5 field6
field7 field8 field9
field10 field11 field12
答案 1 :(得分:1)
sed 's/\(\([^ ]\{1,\} \{1,\}\)\{2\}\([^ ]\{1,\}\) \{1,\}/\1\
/g' YourFile
用一条新线替换一组2组(非空格+空格)而不是1个非空格后的空格,并重复这一过程,直到它可以在线上。
Posix版本为{GNU sed <{1}}
--posix
应该适用于GNU sed(不能从这里测试)
sed 's/(([^ ]+ +){2}([^ ]+) +/\1\n/g' YourFile
也应该在sed上工作(取决于实现)
答案 2 :(得分:1)
以下是awk
版本:
awk '{for (i=1;i<=NF;i++) printf "%s%s",$i,(i%3?FS:RS)}' file
filed1 field2 field3
field4 field5 field6
field7 field8 field9
field10 field11 field12
PS这并没有停留在3,6,9,而是继续(12,15,18 ......)
for (i=1;i<=NF;i++)
通过一个和一个字段循环
printf
打印数据$i
打印当前数据。 i%3?FS:RS
如果提交的是3号,请使用换行符RS
,否则请使用字段分隔符FS
答案 3 :(得分:0)
这可能适合你(GNU sed):
sed 's/ /\n/3;P;D' file
这会将第三个空格更改为换行符,然后打印并删除最多并包含换行符,并重复该过程直到该行被占用。