linux - 如何打印包含句子的列而不丢失awk printf中第一个单词之后的所有内容?
问题描述
我有一个命令
粘贴 dataset1.txt dataset2.txt | 头-7 | 切-f3,5 | awk '{printf "%-20s %s \n", $1, $0}'
以格式化的方式显示来自两个分离文件的两列。但问题是第 2 列(或第 5 列,我使用的第 5 列cut -f3,5
包含句子而不是单个单词(如国家名称),正如您在下面看到的那样,它是 aDescription
所以除了第一个单词之外它不显示任何内容例如,Defines
在2nd and 3rd row
.
我使用的一个不受欢迎的替代方案(下面给出)是 $0,但它显示了所有列。有没有办法我可以修改上面的命令,以便在Description
不获取冗余列且不获取单个单词的情况下按原样显示?
解决方案
您正在使用的命令是:
paste file1 file2 | cut -f3,5 | awk '{printf "%-20s %s \n", $1, $0}'
然而,这里有一些有趣的东西。
- 该命令将由每个文件中由TAB
paste
分隔的顺序对应的行组成的行写入标准输出。 - 该命令
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
推荐阅读
- testing - 使用单个命令以不同的模式运行不同的测试
- c++ - 处理握手时出现 Qt QDtls 错误
- android - 为什么我的改造模型返回 null?安卓科特林
- case - Verilog案例语句中的多个项目匹配
- spring-cloud - 通过 Beans 而不是 application.yml 文件以编程方式配置 Kafka Binder 配置
- c++ - C++ - 删除具有 2 个子节点的节点时出现 BST 分段错误
- angular - 角空路由器链接
- scala - 如何使用 Doobie 插入链接对象
- terraform - 云形成到地形转换
- laravel - 如何在 Laravel 中成功付款后重定向到成功页面