Bash 将单列文件转换为多列
基本上,我想将一列文件转换成由行数指定的多列文件 我不想重新发明轮子。在编写自定义脚本之前,我想确定是否有unix命令或标准方法来执行此操作 例如,假设我有以下文件:Bash 将单列文件转换为多列,bash,unix,command-line,multiple-columns,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 或具有不同delimter的两行文件: $ cat input
$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
或具有不同delimter的两行文件:
$ cat input.txt | my_script --every=2 --delimiter=,
tom,kim,foo
jack,bart,bar
使用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
tom bart
jack foo
kim bar
这里指定raw
变量中所需的行数。例如:row=3
三行
如果只想在特定行中打断列,请尝试这样做
cat文件| xargs-n2
这里每行2个包含2列,您可以使用您想要的。使用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
awk'{a[(NR-1)%n]=a[(NR-1)%n]=''?$1:a[(NR-1)%n]of s$1}END{for(i=0;i首先,您可以使用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
tr'\n'
如何使用xargs
每行两条记录:
$ xargs -n2 < file
tom jack
kim bart
foo bar
$ xargs -n3 < file
tom jack kim
bart foo bar
$xargs-n2
每行三条记录:
$ xargs -n2 < file
tom jack
kim bart
foo bar
$ xargs -n3 < file
tom jack kim
bart foo bar
$xargs-n3
您可以在UNIX中使用粘贴
命令将文件转换为多列。默认情况下,tab是分隔符。要更改分隔符,请使用-d
选项
命令:将一列文件转换为两列
paste - - < input.txt
命令:使用,
作为分隔符将一列文件转换为两列
paste - - -d, < input.txt
我尝试了上面提供的几种解决方案,包括粘贴--
和xargs-n2
,但没有一种满足OP要求,即在一列中包含列表的一半,在另一列中包含另一半h关于代码正在执行的操作的解释
经过一些挖掘,我发现这提供了一个简短而优雅的解决方案,使用pr
:
echo“汤姆
杰克
基姆
巴特
福
bar“>我的文件
cat my|u file | pr-2-t-s
返回:
汤姆·巴特
杰克福
金吧
如果要以逗号分隔,请执行以下操作:
cat my|u file | pr-2-t-s,
返回:
汤姆,巴特
杰克,福
金姆,酒吧
从pr
手册页:
-s字符
按单个字符字符分隔文本列,而不是按适当的字符数分隔(字符的默认值为字符)。
-t不打印通常为每页提供的五行标识页眉或五行尾部。在每个文件的最后一行之后停止打印,不打印
到页面末尾的间距。
Op想要tom bart;jack foo;kim bar这就给出了tom jack;kim bart;foo bar这实际上不是我想要的。对于两列示例,我希望tom,jack,kim在同一列中