用新线sed替换第二个空格

时间:2018-03-27 10:44:26

标签: awk sed

我的数据格式如下:

1234 2 3457 2 23454 12 98769 1 123 20

我试图以下面的格式获取数据:

1234 2 
3457 2 
23454 12 
98769 1 
123 20 

我尝试使用:

sed -E -e 's/[[:blank:]]+/\n /2' test.txt

但这不起作用。

4 个答案:

答案 0 :(得分:6)

只需使用 shell builtin:

$ printf '%d %d\n' 1234 2 3457 2 23454 12 98769 1 123 20

或使用(赠送给fedorqui):

$ echo "1234 2 3457 2 23454 12 98769 1 123 20" |
    sed -E 's/([0-9]+\s[0-9]+)\s/\1\n/g'

$ echo '1234 2 3457 2 23454 12 98769 1 123 20' |
    grep -oE '[0-9]+\s[0-9]+'

或使用(归功于格伦杰克曼):

$ echo "1234 2 3457 2 23454 12 98769 1 123 20" |
    tr -s '[:blank:]' '\n' |
    paste -d" " - -

$ echo '1234 2 3457 2 23454 12 98769 1 123 20' |
    perl -lne 'print for /(\d+\s+\d+)+/g'

输出:

1234 2
3457 2
23454 12
98769 1
123 20

注意:

如果您有标记,我们可以使用 bashism 删除一个管道|

command <<< 'foo bar base'
  

这是 here-string 。与此处的文档类似:​​<<<之后的单词和换行符将传递给命令的标准输入。语法:command <<< "some sentence"(与echo "some sentence" | command类似,但没有子shell的开销)

一点基准:

$ time printf '%d %d\n' 1234 2 3457 2 23454 12 98769 1 123 20

real    0m0,000s
user    0m0,000s
sys     0m0,000s

答案 1 :(得分:3)

allMarks 解决方案:

Awk
  • awk '{ for(i=1; i<=NF; i+=2) print $i, $(i+1) }' test.txt - 增量步骤(每次迭代处理2个项目)

输出:

i+=2

答案 2 :(得分:2)

以下1234 2 3457 2 23454 12 98769 1 123 20 解决方案可能会对您有所帮助。

xargs

输出如下。

xargs -n2 < Input_file

答案 3 :(得分:2)

这可能适合你(GNU sed):

sed 's/\s/\n/2;P;D' file

用换行符替换第二个空格。打印到包含换行符,然后删除打印的内容。重复直到模式空间为空,然后用下一行补充模式空间并重复。