
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 展开
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 展开
2个回答
展开全部
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"任选其一,测试过了 可行。
还有什么问题请继续追问
这个应该没问题了 试试
有问题请追问
多的话不想多说了:
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] 不输出,后面的照样输出
追答
你这个追问的问题我实在没看懂,我理解你的问题的意思是 文本二与文本一行号相同但是字段二不同 就将文本二的那一行输出,你再把问题详细一下;你要的命令到底想干什么,详细的说一下。
展开全部
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
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)
}' xx11.1 xx11.2
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询