Bash 来自同一流的列的串联

Bash 来自同一流的列的串联,bash,shell,cut,Bash,Shell,Cut,与我以前的经历有关 从具有列的流中 cat文件 a d 1 4 b e 2 5 c f 3 6 如何将列/字段连接到列中,例如,如下所示 我已尝试使用我的首选命令cut,如下所示,但仅使用第一个cut命令的输出 cat文件|(cut-f1,3;cut-f2,4;) 或 cat文件{cut-f1,3;cut-f2,4;} a 1 b 2 c 3 使用awk你可以做什么 awk '{for(i=1;i<=NF-2;i+

与我以前的经历有关

从具有列的流中

cat文件

a    d    1    4
b    e    2    5
c    f    3    6
如何将列/字段连接到列中,例如,如下所示

我已尝试使用我的首选命令
cut
,如下所示,但仅使用第一个
cut
命令的输出

cat文件|(cut-f1,3;cut-f2,4;)


cat文件{cut-f1,3;cut-f2,4;}

a    1
b    2
c    3
使用awk你可以做什么

awk '{for(i=1;i<=NF-2;i++)a[$i]=$(i+2)}END{for(i in a)print i,a[i]}' test

a 1
b 2
c 3
d 4
e 5
f 6
不起作用,因为第一个切割会消耗流,而它永远不会到达第二个切割

你可以这样做

<file tee >(cut -f2,4) >(cut -f1,3) >/dev/null
(cut-f2,4)>(cut-f1,3)>/dev/null
这会将流发送到这两个命令。

使用awk可以执行以下操作

awk '{for(i=1;i<=NF-2;i++)a[$i]=$(i+2)}END{for(i in a)print i,a[i]}' test

a 1
b 2
c 3
d 4
e 5
f 6
不起作用,因为第一个切割会消耗流,而它永远不会到达第二个切割

你可以这样做

<file tee >(cut -f2,4) >(cut -f1,3) >/dev/null
(cut-f2,4)>(cut-f1,3)>/dev/null

这将向这两个命令发送流。

cat文件|
=对cat的无用使用;你可以用
代替

cut -f1,3 <file
cut -f2,4 <file

cut-f1,3
cat文件|
=对cat的无用使用;你可以用
代替

cut -f1,3 <file
cut -f2,4 <file

cut-f1,3
awk'{print$1,$3}文件;awk{print$2,$4}文件
awk{print$1,$3}文件;awk{print$2,$4}文件
A
,而
/
读取
循环很慢,除非你有一个非常小的文件,否则你不启动一个专用进程所获得的任何东西都会丢失。我同意,但这取决于在循环中所做的事情,我只使用简单的变量扩展和echo内置,如果调用进程扩展或子shell,它将是最糟糕的,单独读取速度较慢。你可以有一个空的循环体,它将比
cat
慢。这是真的
perl-e'print“hello\n”x1000000'{读时;do:;done;}
/
perl-e'print“hello\n”x1000000'| cat>/dev/null
A
,而
/
读时
循环很慢,除非你有一个非常小的文件,否则你不启动一个专用进程所获得的任何东西都会丢失。我同意,但这取决于在循环中所做的事情。我只使用简单的变量扩展和回显内置。如果进程扩展或子外壳被调用,那么它将是最糟糕的。单独读取速度较慢。您可以有一个空的循环体,它将比
cat
慢。这是正确的
perl-e'print“hello\n”x1000000'{在读取时;do:;done;}
/
perl-e'print“hello\n”x1000000'| cat>/dev/null
perl -a -pe '$_="$F[0]\t$F[2]\n";$s.="$F[1]\t$F[3]\n";END{print$s}' <file