将单列文件转换为多列

时间:2014-04-11 06:08:29

标签: bash unix command-line multiple-columns

基本上,我想将一个列文件转换为由行数指定的多个列文件。

我不想重新发明轮子。我想在编写自定义脚本之前确保是否有unix命令/或标准方法。

例如,我们说我有以下文件:

$cat input.txt
tom
jack
kim
bart
foo
bar

我想把它变成3行文件

$ cat input.txt | my_script --every=3 --delimiter=tab
tom bart
jack foo
kim bar

或带有不同分隔符的2行文件:

$ cat input.txt | my_script --every=2 --delimiter=,
tom,kim,foo
jack,bart,bar

6 个答案:

答案 0 :(得分:8)

如何使用xargs

每行两个记录:

$ xargs -n2 < file
tom jack
kim bart
foo bar

每行三条记录:

$ xargs -n3 < file
tom jack kim
bart foo bar

答案 1 :(得分:3)

使用awk

 awk -v row=2 '{A[(NR-1)%row]=A[(NR-1)%row]$0" ";next}END{for(i in A)print A[i]}' file

输出:

tom  bart 
jack foo 
kim  bar 

此处在raw变量中指定所需的行数。例如:row=3三行。

如果您只希望在特定行中使用break列

,请尝试这样做

cat file | xargs -n2

这里每行2包含2列,你可以使用你想要的。

答案 2 :(得分:3)

您可以在UNIX中使用paste命令将文件转换为多个列。默认情况下,tab是分隔符。要更改分隔符,请使用-d选项

命令:将一个列文件转换为两列

paste - - < input.txt

输出:

tom  bart 
jack foo 
kim  bar

命令:将一个列文件转换为两列,,作为分隔符

paste - - -d, < input.txt

输出:

tom,bart 
jack,foo 
kim,bar

答案 3 :(得分:1)

使用awk

awk '{a[(NR-1)%n]=a[(NR-1)%n]==""?$1:a[(NR-1)%n] OFS $1}END{for (i=0;i<n;i++) print a[i]}' n=3 OFS="\t" file

tom     bart
jack    foo
kim     bar


awk '{a[(NR-1)%n]=a[(NR-1)%n]==""?$1:a[(NR-1)%n] OFS $1}END{for (i=0;i<n;i++) print a[i]}' n=2 OFS="," file

tom,kim,foo
jack,bart,bar

答案 4 :(得分:1)

我尝试了上面提供的几种解决方案,包括paste - -xargs -n2,但是这些解决方案都不能满足OP要求,即在列表的一列中有一半的列表,而在列表中的另一半中有列表的一半。其他列。我没有尝试过awk解决方案,因为它看起来笨拙,冗长,并且对代码的作用没有太多解释。

经过一番挖掘,我发现使用pr可以给出一个简短而优雅的解决方案:

echo "tom
jack
kim
bart
foo
bar" > my_file

cat my_file | pr -2 -t -s

返回:

tom bart
jack    foo
kim bar

如果要用逗号分隔:

cat my_file | pr -2 -t -s,

返回:

tom,bart
jack,foo
kim,bar

pr联机帮助页中:

-s char
      Separate text columns by the single character char instead of by the appropriate number of <space>s (default for char is the <tab> character).

-t    Print neither the five-line identifying header nor the five-line trailer usually supplied for each page.  Quit printing after the last line of each file without
      spacing to the end of the page.

答案 5 :(得分:0)

首先,您可以使用sed来获取正确的数据,例如

$ sed -n '1~2p' input
tom
kim
foo

$ sed -n '2~2p' input
jack
bart
bar

然后有很多方法可以将列转换为行。仅举几例:

tr '\n' ' ' < file

awk -vORS=' ' 1 file

paste -sd" " file