如何用awk命令实现:打印匹配行部分内容、对比行仅输出首行
没问题,这就给你搞定这两个awk需求~
需求一:编写awk命令,仅打印匹配行的部分内容
这个需求日常用得挺多的,比如你想揪出文件里带特定关键词的行,然后只输出其中某几个字段。举个实际例子:假设你有个file.txt,想匹配包含going的行,只打印第1个和第3个字段,用这个命令就行:
awk '/going/ {print $1, $3}' file.txt
简单说下逻辑:
/going/是匹配规则,awk会自动找出所有包含going的行{print $1, $3}是执行的动作,$1代表行的第一个字段,$3是第三个字段(awk默认用空格/制表符分隔字段)- 如果你的字段分隔符不是空格,还可以用
-F参数指定,比如处理逗号分隔的CSV文件,想匹配关键词并输出第2列,就是awk -F ',' '/关键词/ {print $2}' file.txt
需求二:编写awk命令,对比文件中的各行,当后续行包含首行未出现的新词时,仅输出首行
针对你给出的示例文件,我们可以用awk的数组来实现这个逻辑,直接上可运行的命令:
awk 'NR==1{ first_line = $0 for(i=1; i<=NF; i++){ words[$i] = 1 } next } { for(i=1; i<=NF; i++){ if(!($i in words)){ need_print = 1 exit } } } END{ if(need_print) print first_line }' file.txt
运行后就能得到你想要的i am going输出,拆解下逻辑:
- 处理首行(
NR==1表示当前是第一行):把首行内容存到first_line变量里,同时把首行的每个词存入words数组,用单词当键值,方便后续快速检查 - 处理后续行:遍历当前行的每个词,如果发现某个词不在
words数组里(也就是首行没有的新词),就标记need_print为1,然后直接退出(不用再检查其他行,效率更高) - 最后在
END块里判断,如果need_print为1,就打印之前保存的首行内容
要是想写成一行简洁版,也可以这样:
awk 'NR==1{fl=$0;for(i=1;i<=NF;i++)w[$i]=1;next}{for(i=1;i<=NF;i++)if(!($i in w)){p=1;exit}}END{if(p)print fl}' file.txt
内容的提问来源于stack exchange,提问作者Abhinash
相关产品推荐
相关产品推荐

