并排显示四个文件

时间:2014-11-26 21:06:40

标签: linux bash awk

如何使用bash并排显示四个文件? 文件名是:data2 data4 data5和data6。

我试过

paste data2 data4 data5 data6 |awk -F"," '{printf("%-50s %s\n",$1,$2,$3,$4,$5)}' > data3

这几乎可行,但由于某种原因它不输出每个文件的最后一列(每个文件的最后一列只是一个逗号“,”)。我也需要包含最后一栏。

感谢。

2 个答案:

答案 0 :(得分:0)

您告诉awk逗号是字段分隔符,因此它不会保留逗号。您还打印$1$2,因为格式中只有两个%s规范(忽略$3$5)。告诉awk使用paste使用的标签字符。

paste data2 data4 data5 data6 |
awk -F $'\t' '{printf("%-30s %-30s %-30s %s\n", $1, $2, $3, $4)}'

$'\t'是一个名为ANSI C Quoting的Bash扩展程序。如果您没有使用Bash,请使用-F ' ',其中两个单引号之间有一个制表符(可能使用 Control-V Tab 输入)。 / p>

此代码确实假设数据文件中没有选项卡。如果有选项卡,则选择不在任何文件中作为分隔符的其他字符 - 也许 Control-A - 并告诉pasteawk请改用:

paste -d $'\001' data2 data4 data5 data6 |
awk -F $'\001' '{printf("%-30s %-30s %-30s %s\n", $1, $2, $3, $4)}'

答案 1 :(得分:0)

这是gnu awk解决方案

awk -F, -v OFS="\t" '
  ARGIND == 1 {f1[FNR]=$0;c=c<FNR?FNR:c;next}
  ARGIND == 2 {f2[FNR]=$0;c=c<FNR?FNR:c;next}
  ARGIND == 3 {f3[FNR]=$0;c=c<FNR?FNR:c;next}
  ARGIND == 3 {f4[FNR]=$0;c=c<FNR?FNR:c;next}
END { 
  for (i=1;i<=c;i++) print f1[i],f2[i],f3[i],f4[i]}
' data2 data4 data5 data6

它使用ARGIND将每个文件读入不同的数组,然后是 以正确的格式打印出来。