linux - 如何打印包含句子的列而不丢失 awk printf 中第一个单词之后的所有内容?

标签 linux bash shell awk

我有一个命令

paste dataset1.txt dataset2.txt | head -7 | cut -f3,5 | awk '{printf "%-20s %s \n", $1, $0}'

以格式化方式显示两个单独文件中的两列。但问题是我使用 cut -f3,5 得到的第二列(或第 5 列)由句子组成,而不是单个单词(如国家/地区名称),正如您在下面看到的那样,它是一个 Description,因此除了第一个单词之外,它不会显示任何内容,例如,第二行和第三行 中的 Defines

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

Output of the command

最佳答案

您使用的命令是:

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

但是,这里有一些有趣的事情。

  • 命令paste将由每个文件中按顺序对应的行(以 TAB 分隔)组成的行写入标准输出。
  • 命令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}'

注意:我们甚至可以合并 file1file2awk命令行。 pasteawk看起来像:

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

关于linux - 如何打印包含句子的列而不丢失 awk printf 中第一个单词之后的所有内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52269816/

相关文章:

java - Linux 上的 XmlReader Java 和 Jboss 无法正确匹配长字符串

android - adb pull 在 bash 脚本中的奇怪行为

parsing - Bash:将文本文件拆分为以非字母数字字符作为分隔符的单词

json - 使用 jq 将 JSON 转换为 Markdown 列表

c - 连接到 FIFO(命名管道)的程序挂起

linux - wp cli 与 crontab

c - 如何测量 Linux 上 C 语言的执行时间

linux - 将共享库与静态链接起来不可移植

linux - 如何使用 grep 修剪特定文本

bash - 苹果电脑 : Virtual Shell Bash Version does not Match Installed Version