基本上,我想将一个列文件转换为由行数指定的多个列文件。
我不想重新发明轮子。我想在编写自定义脚本之前确保是否有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
答案 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