[root@iZbp1cr1sgiqi6r6qlygx9Z tmp]# awk ‘{print NR;print FNR;print $0 }’ aaa
1
1
1111:23434:zhang
2
2
hoadsf:asdf:ccc
[root@iZbp1cr1sgiqi6r6qlygx9Z tmp]# cat ccc
1111:23434:zhang
hoadsf:asdf:ccc
tank:zhang:x20342
ying:zhasdf:72342
hosa:asdfa:2345sdf
[root@iZbp1cr1sgiqi6r6qlygx9Z tmp]# awk ‘{print NR;print FNR;print $0}’ ccc
1
1
1111:23434:zhang
2
2
hoadsf:asdf:ccc
3
3
tank:zhang:x20342
4
4
ying:zhasdf:72342
5
5
hosa:asdfa:2345sdf
[root@iZbp1cr1sgiqi6r6qlygx9Z tmp]# awk ‘{print NR;print FNR;print $0}’ aaa ccc
1
1
1111:23434:zhang
2
2
hoadsf:asdf:ccc
3
1
1111:23434:zhang
4
2
hoadsf:asdf:ccc
5
3
tank:zhang:x20342
6
4
ying:zhasdf:72342
7
5
hosa:asdfa:2345sdf
将两个文件具有相同列的行进行合并
awk -F’|’ ‘NR==FNR{a[$2]=$0;next}{print a[$1] FS $2}’ a b
这个awk命令用于处理两个文件(在这个例子中是a和b),并基于它们之间的共同字段(这里是第二个字段和第一个字段)来合并或匹配行的内容。具体来说,命令使用了-F’|’来指定输入字段的分隔符为|。下面是对命令的详细解释:
NR==FNR{a[$2]=$0;next}
NR是当前已读取的记录数(对于awk来说,通常等同于行号)。
FNR是当前文件已读取的记录数。
当NR==FNR时,意味着awk正在处理第一个文件(在这个例子中是a文件),因为NR和FNR只在处理第一个文件时相等(之后NR会继续增加,而FNR会在开始处理新文件时重置为1)。
a[$2]=$0:这里创建了一个关联数组a,其索引是文件a中每行的第二个字段(由$2表示),值是整行内容(由$0表示)。
next:这个命令会跳过当前行的后续模式(即跳过{print a[$1] FS $2}部分),继续处理下一行。
{print a[$1] FS $2}
当awk开始处理第二个文件(在这个例子中是b文件)时,NR和FNR不再相等,因此上述NR==FNR的条件不再满足,awk会执行这个模式。
print a[$1] FS $2:这里尝试从之前构建的数组a中,使用当前行(来自文件b)的第一个字段($1)作为索引来查找并打印对应的整行内容。然后,使用FS(字段分隔符,这里已经被设置为|)将找到的整行内容和当前行的第二个字段连接起来并打印出来。
注意:这个命令的假设是文件b中的每一行的第一个字段都能在文件a的某一行的第二个字段中找到匹配项。如果文件b中的某个行的第一个字段在文件a中没有对应的第二个字段值,那么a[$1]将会是空的,因此只会打印出$2(文件b的当前行的第二个字段),且前面没有内容。
此外,如果文件a中的某个行的第二个字段在文件b中作为第一个字段出现多次,那么该命令只会使用a中对应的行与b中第一个匹配的行进行合并。如果需要处理多个匹配项,可能需要更复杂的逻辑。
由nr=fnr为真时,判断当前读入的是第一个文件a,然后使用{a[$2]=$0;next}
循环将a文件的每行记录都存入数组a,并使用$2第2个字段作为下标引用.
由nr=fnr为假时,判断当前读入了第二个文件b,然后跳过{a[$2]=$0;next},
对第二个文件cdr的每一行都无条件执行{print a[$1]”|”$2},
awk -F’|’ ‘NR==FNR{a[$2]=$0;next}{print a[$1] FS $2}’ a b
找出两个文件之间的不同部分
找出A和B中相同的数据并输出
[root@iZbp1cr1sgiqi6r6qlygx9Z tmp]# cat f
123
456
789
[root@iZbp1cr1sgiqi6r6qlygx9Z tmp]# cat h
123 John Doe
456 Jane Smith
999 Alice Johnson
next 语句跳过当前循环的剩余部分,并立即开始处理下一行(仅对第一个文件有效)
awk ‘NR==FNR {a[$1]++; next} NR>FNR {if ($1 in a) print $1}’ f h
[root@iZbp1cr1sgiqi6r6qlygx9Z tmp]# awk ‘NR==FNR {a[$1]++; next} NR>FNR {if ($1 in a) print $1}’ f h
123
456
取不同部分
[root@iZbp1cr1sgiqi6r6qlygx9Z tmp]# awk ‘NR==FNR{a[$1]} NR>FNR{if(!($1 in a)) print $0}’ f h
999 Alice Johnson
a[$0] 是在数组a中以当前行的全部内容($0)作为索引存储的一个元素。由于这里只使用了a[$0]而没有赋值,实际上这行代码本身并不改变数组a的内容(除非在之前的某个地方已经定义了数组a的赋值行为,但在这个上下文中没有)。不过,按照常见的Awk用法,这里可能是想表达“将当前行的内容作为索引存入数组a中”,但正确的做法应该是a[$0]=”something”,但这里简单用a[$0]是为了记录第一个文件中出现过的行。
if(!($1 in a)) print $0 这个条件判断检查第二个文件的当前行的第一个字段是否没有作为索引存储在数组a中。如果是这样(即,这个字段在第一个文件中没有出现过),则打印出当前行。
感谢您的来访,获取更多精彩文章请收藏本站。
1. 资源都是经过站长或作者收集测试修改后发布分享。转载请在文内以超链形式注明出处,谢谢合作!
2. 本站除原创内容,其余所有内容均收集自互联网,仅限用于学习和研究目的,本站不对其内容的合法性承担任何责任。如有版权内容,请通知我们或作者删除,其版权均归原作者所有,本站虽力求保存原有版权信息,但因众多资源经多次转载,已无法确定其真实来源,或已将原有信息丢失,所以敬请原作者谅解!
3. 本站用户所发布的一切资源内容不代表本站立场,并不代表本站赞同其观点和对其真实性负责,若您对本站所载资源作品版权归属存有异议,请留言附说明联系邮箱,我们将在第一时间予以处理 ,同时向您表示歉意!为尊重作者版权,请购买原版作品,支持您喜欢的作者,谢谢!
4. 本站一律禁止以任何方式发布或转载任何违法的相关信息,访客如有发现请立即向站长举报;本站资源文件大多存储在云盘,如发现链接或图片失效,请联系作者或站长及时更新。


彩虹易支付使用教程-晴天生活分享日志">



暂无评论内容