与我之前的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
答案 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