将分隔的字段移动到新行

时间:2014-04-09 07:20:45

标签: linux shell unix awk

我有逗号分隔的txt文件,该文件必须只有五列,但有些行的列数超过5列。
我想将第6个到第10个移动到换行符,将第11个到第15个移到换行符上等等

以下是input.txt

的标准
1,2,3,4,5
12,13,14,15,16,11,17,18,19,20
22,23,24,25,26,22,27,28,29,21,30,31,32,33,34

以下是Output.txt

的标准
1,2,3,4,5
12,13,14,15,16
11,17,18,19,20
22,23,24,25,26
22,27,28,29,21
30,31,32,33,34

我正在尝试使用awk完成此操作,但没有运气。我想要输出如上所述。

4 个答案:

答案 0 :(得分:1)

这个怎么样?

sed 's/,/ /g' file|xargs -n5 |sed 's/ /,/g'

1,2,3,4,5
12,13,14,15,16
11,17,18,19,20
22,23,24,25,26
22,27,28,29,21
30,31,32,33,34

解释。

1)sed命令:sed 's/,/ /g'sed 's/ /,/g'用于替换字符。

2)xargs -n5:

   -n max-args, --max-args=max-args
          Use at most max-args arguments per command line.  Fewer than max-args arguments will be
          used if the size (see the -s option) is exceeded, unless the -x  option  is  given,  in
          which case xargs will exit.

答案 1 :(得分:1)

您可以使用grep

grep -oP '([^,]+,){4}[^,]+' inputfile

grep -oE '([^,]+,){4}[^,]+' inputfile

egrep -o '([^,]+,){4}[^,]+' inputfile

为了您的输入,它会产生:

1,2,3,4,5
12,13,14,15,16
11,17,18,19,20
22,23,24,25,26
22,27,28,29,21
30,31,32,33,34

答案 2 :(得分:1)

使用awk

awk -F, '{for (i=1;i<=NF;i++) printf "%s"(i%5==0?RS:FS),$i}' file
1,2,3,4,5
12,13,14,15,16
11,17,18,19,20
22,23,24,25,26
22,27,28,29,21
30,31,32,33,34

答案 3 :(得分:0)

假设您总共有5个元素的模数,并且您想要完全填充每一行,您还可以使用trpaste,如下所示:

<file tr , \\n | paste -d, - - - - -

输出:

1,2,3,4,5
12,13,14,15,16
11,17,18,19,20
22,23,24,25,26
22,27,28,29,21
30,31,32,33,34