来自同一流

时间:2017-05-26 08:58:29

标签: bash shell cut

与我之前的question相关。

来自带有列的流。

  

cat file

a    d    1    4
b    e    2    5
c    f    3    6

列/字段如何连接成列,例如像这样。

a    1
b    2
c    3
d    4
e    5
f    6

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

  

cat file | ( cut -f1,3; cut -f2,4; )
  或
  cat file | { cut -f1,3; cut -f2,4; }

a    1
b    2
c    3

2 个答案:

答案 0 :(得分:2)

使用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

因此将密钥保存到关联数组中并在其旁边分配字段。

请注意,这不会保留顺序,如果确实如此,那只是巧合。

也是你原来的

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

不起作用,因为第一次剪切消耗了流,它永远不会到达第二个。

您可以执行类似

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

将流发送到两个命令。

答案 1 :(得分:0)

cat file | =无用的猫;可以使用< file代替

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

但从性能的角度来看,它会启动2个进程,打开文件两次并读取两次,这可以通过内置来完成

str=
while read k1 k2 v1 v2; do
    echo "$k1"$'\t'"$v1"
    str=$str$k2$'\t'$v2$'\n'
done < file
echo -n "$str"
编辑:由于读取性能不佳,对于大文件,最好使用像awk,sed或更完整的perl这样的文本处理工具,例如这里的单行:

perl -a -pe '$_="$F[0]\t$F[2]\n";$s.="$F[1]\t$F[3]\n";END{print$s}' <file