shell awk 2个文本遍历比较

文本1:1aa2bb文本2aaaaaabbbbbbcccccc如果文本1中的字段2不等于文本2的字段2,则打印cccccc按照百度到的写,结果什么都没有awk'NR==F... 文本1:
1 aa
2 bb
文本2
a aa aaa
b bb bbb
c cc ccc
如果文本1中的字段2 不等于文本2 的字段2 ,则打印c cc ccc
按照百度到的写,结果什么都没有
awk 'NR==FNR{a[FNR]=$2;num=FNR} NR>FNR{for(n=1;n<=
num;n++) {if($2 != a[n]) print}‘ 文本1 文本2
请帮忙解答
文本m:
x aa 1 2 3 4
y bb 1 2 3 4
x aa 1 2 5 8
y bb 1 2 4 3
z cc 3 3 3 3
y bb 1 1 6 4
z cc 1 1 1 1
去除字段一和字段二相同的行,并将后面的值相加
x aa 2 4 8 12
y bb 3 5 13 11
z cc 4 4 4 4
展开
 我来答
我叫熊拍拍
2013-02-04 · TA获得超过210个赞
知道小有建树答主
回答量:101
采纳率:0%
帮助的人:99.1万
展开全部
awk 'NR==FNR{a[FNR]=$2}NR!=FNR{if($2!=a[FNR]){print}}' file1 file2
这个应该没问题了 试试

有问题请追问

多的话不想多说了:
localhost:test $ cat file1
1 aa
2 bb
localhost:test $ cat file2
a aa aaa
b bb bbb
c cc ccc
localhost:test $ awk 'NR==FNR{a[FNR]=$2}NR!=FNR{if($2!=a[FNR]){print}}' file1 file2
c cc ccc

我是直接复制的,如果你自己打错了或者是没把分隔符搞清楚,自己仔细看看吧。

果然是分隔符的问题,看见你print的\t了吗?是制表符,而你在问题里的文本是用空格隔开的,我专门看过了。awk默认的分隔符是空格,所以需要修改。命令如下:
awk -F '\t' 'NR==FNR{a[FNR]=$2}NR!=FNR{if($2!=a[FNR]){print}}' file1 file2

用-F '\t'来指定分隔符为制表符\t就可以了

还有问题请继续追问

可能是 文件一和文件二的分隔符是不同的,文件一的分隔符为空格而文件二的分隔符为制表符\t(完全可以用vim set list 看一下每个文件的分隔符到底是什么),试试这个吧:
awk -F '[\t ]' 'NR==FNR{a[FNR]=$2}NR!=FNR{if($2!=a[FNR]){print}}' file1 file2
用正则表达式表示两种分隔符" " "\t"任选其一,测试过了 可行。

还有什么问题请继续追问
更多追问追答
追问
奇怪了,是少输入一个文本2的内容 ,只把第一个$2=a[FNR] 不输出,后面的照样输出
追答
你这个追问的问题我实在没看懂,我理解你的问题的意思是 文本二与文本一行号相同但是字段二不同 就将文本二的那一行输出,你再把问题详细一下;你要的命令到底想干什么,详细的说一下。
luneng8183
2013-02-04 · TA获得超过902个赞
知道小有建树答主
回答量:606
采纳率:100%
帮助的人:525万
展开全部
o@t ~/work/shell $ cat xx11.1
aa
bb
o@t ~/work/shell $ cat xx11.2
a aa aaa
b bb bbb
c cc ccc
o@t ~/work/shell $ ./xx11
c cc ccc
o@t ~/work/shell $ cat ./xx11
#!/bin/bash

awk '
(NR==FNR) {
key[FNR]=$1
num=FNR
}

(NR>FNR) {
imatch=0

for(n=1;n<=num;n++)
if($2==key[n])
imatch=1

if(imatch==0)
print
}' xx11.1 xx11.2
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式