首页 > 解决方案 > 如何打印包含句子的列而不丢失awk printf中第一个单词之后的所有内容?

问题描述

我有一个命令

粘贴 dataset1.txt dataset2.txt | 头-7 | 切-f3,5 | awk '{printf "%-20s %s \n", $1, $0}'

以格式化的方式显示来自两个分离文件的两列。但问题是第 2 列(或第 5 列,我使用的第 5 列cut -f3,5包含句子而不是单个单词(如国家名称),正如您在下面看到的那样,它是 aDescription所以除了第一个单词之外它不显示任何内容例如,Defines2nd and 3rd row.

我使用的一个不受欢迎的替代方案(下面给出)是 $0,但它显示了所有列。有没有办法我可以修改上面的命令,以便在Description不获取冗余列且不获取单个单词的情况下按原样显示?

命令的输出

标签: linuxbashshellawk

解决方案


您正在使用的命令是:

paste file1 file2 | cut -f3,5 | awk '{printf "%-20s %s \n", $1, $0}'

然而,这里有一些有趣的东西。

  • 该命令将由每个文件中由TABpaste分隔的顺序对应的行组成的行写入标准输出。
  • 该命令cutTAB作为输入和输出的默认分隔符。

所以,最后,需要做的就是告诉 awk 使用 TAB 作为分隔符,而不是默认的任何形式的空格

paste file1 file2 | cut -f3,5 | awk -F'\t' '{printf "%-20s %s \n", $1, $2}'

但实际上,我们可以将剪切与awk

paste file1 file2 | awk -F'\t' '{printf "%-20s %s \n", $3, $5}'

注意:我们甚至可以在命令行中合并file1和。看起来像:file2awkpasteawk

awk 'BEGIN{OFS="\t"}(NR==FNR){a[NR]=$0;next}{print a[NR], $0}' file1 file2

所以 while 行可以写成:

awk 'BEGIN{FS=OFS="\t"}
     (NR==FNR){a[NR]=$0;next}
     {$0=a[NR] OFS $0}
     { printf "%-20s %s \n", $3, $5 }' file1 file2

推荐阅读