Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将单列文件转换为多列_Bash_Unix_Command Line_Multiple Columns - Fatal编程技术网

Bash 将单列文件转换为多列

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

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

我不想重新发明轮子。在编写自定义脚本之前,我想确定是否有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.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在同一列中