You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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输出,拆解下逻辑:

  1. 处理首行(NR==1表示当前是第一行):把首行内容存到first_line变量里,同时把首行的每个词存入words数组,用单词当键值,方便后续快速检查
  2. 处理后续行:遍历当前行的每个词,如果发现某个词不在words数组里(也就是首行没有的新词),就标记need_print为1,然后直接退出(不用再检查其他行,效率更高)
  3. 最后在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:42:11