我有一个命令
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
,而不会获得冗余列,也不会只获得单个单词?
最佳答案
您使用的命令是:
paste file1 file2 | cut -f3,5 | awk '{printf "%-20s %s \n", $1, $0}'
但是,这里有一些有趣的事情。
- 命令
paste
将由每个文件中按顺序对应的行(以 TAB 分隔)组成的行写入标准输出。 - 命令
cut
将 TAB 作为输入和输出的默认分隔符。
所以,最后,需要做的就是告诉 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
和file2
在 awk
命令行。 paste
在awk
看起来像:
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/