本篇文章给大家谈谈bash–在两个文件中计算相等的行数,同时本文还将给你拓展AWK/BASH:如何匹配一个文件中的字段与另一个文件中的字段?、bash–从另一个文件中的一个文件中删除行、bash–使用
本篇文章给大家谈谈bash – 在两个文件中计算相等的行数,同时本文还将给你拓展AWK / BASH:如何匹配一个文件中的字段与另一个文件中的字段?、bash – 从另一个文件中的一个文件中删除行、bash – 使用awk如何合并2个文件,比如A&B并执行左外连接功能并包含两个文件中的所有列、bash – 使用命令行工具计算文件中的行长度等相关知识,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:- bash – 在两个文件中计算相等的行数
- AWK / BASH:如何匹配一个文件中的字段与另一个文件中的字段?
- bash – 从另一个文件中的一个文件中删除行
- bash – 使用awk如何合并2个文件,比如A&B并执行左外连接功能并包含两个文件中的所有列
- bash – 使用命令行工具计算文件中的行长度
bash – 在两个文件中计算相等的行数
1 3 2 4 5 0 10
和file2包含
3 10 5 64 15
在这种情况下,答案应该是3(公共线是’3′,’10’和’5′).
当然,这可以通过python完成,例如,但我很好奇从bash(使用一些标准工具或awk或其他任何东西)这样做.这就是我提出的:
cat file1 file2 | sort | uniq -c | awk '{if ($1 > 1) {$1=""; print $0}}' | wc -l
这对任务来说似乎太复杂了,所以我想知道是否有更简单或更优雅的方法来实现相同的结果.
附:将公共部分的百分比输出到每个文件中的行数也很不错,但这不是必需的.
UPD:文件没有重复的行
awk 'a[$0]++' file1 file2
将输出3 10 15
现在,只需将其传递给wc以获取公共线的数量:
awk 'a[$0]++' file1 file2 | wc -l
将输出3.
说明:
这里的工作类似于默认值为0的字典.当你写一个[$0]时,你会在[$0]中加1,但是这个指令返回一个[$0]的前一个值(见difference between a++ and ++a).所以你第一次遇到某个字符串时会有0(= false),下次会遇到1(或更多,仍然=真).
默认情况下,awk’condition’文件是输出条件为true的所有行的语法.
还要注意每次遇到新密钥时a []数组都会扩展.在脚本结束时,数组的大小将是您在所有输入文件中拥有的唯一值的数量(在OP的示例中,它将是9).
注意:此解决方案计算重复项,即如果您有:
file1 | file2 1 | 3 2 | 3 3 | 3
awk’一个[$0]’file1 file2将输出3 3 3并且awk’一个[$0]’file1 file2 | wc -l将输出3
AWK / BASH:如何匹配一个文件中的字段与另一个文件中的字段?
... John Allen Smith II 16 555-555-5555 10/24/2010 John Allen Smith II 3 555-555-5555 10/24/2010 John Allen Smith II 17 555-555-5555 10/24/2010 John Doe 16 555-555-5555 10/24/2010 Jane Smith 16 555-555-5555 9/16/2010 Jane Smith 00 555-555-5555 10/24/2010 ...
第二个文件是一个名字列表所以……
... John Allen Smith II John Doe Jane Smith ...
是否可以使用awk(或其他bash命令)打印第一个文件中与第二个文件中的任何名称匹配的行(名称可以在第一个文件中重复)
奖金?有没有一种简单的方法可以删除第一个文件中的重复/重复行?
非常感谢,
托梅克
解决方法
#! /bin/bash awk 'FNR==NR{!a[$0]++;next }{ b[$0]++ } END{ for(i in a){ for(k in b){ if (a[i]==1 && i ~ k ) { print i } } } }' file1 file2
bash – 从另一个文件中的一个文件中删除行
line1 line2 line3 line4 .. ..
我想删除在另一个文件f2中的所有行:
line2 line8 .. ..
我尝试了一些猫和sed,这是不是接近我的意图。我如何做到这一点?
说明:
> -v选择不匹配的行
> -x仅匹配整行
> -f f2从f2获取模式
可以改为使用-f f2来匹配f2的固定字符串,而不是模式(如果你想删除“你看到的是什么,你得到什么”的方式,而不是将f2的行作为正则表达式模式)。
bash – 使用awk如何合并2个文件,比如A&B并执行左外连接功能并包含两个文件中的所有列
我尝试过以下代码来接近我的输出.但我无法打印“,”,在第二个文件中找不到匹配的数字.下面是代码.加入需要排序并花费比awk更多的时间.我的文件大小很大,如3000万条记录.
awk -F ',' '{ if (NR==FNR){ r[$1]=$0} else{ if($1 in r) r[$1]=r[$1]gensub($1,"",1)} }END{for(i in r){print r[i]}}' file1 file2
file1
number,column1,column2,..columnN
File2
numbr,..columnN
Output
number,file1.column1,file1.column2,..file1.columnN,file2.column1,file2.column3...,file2.columnN
file1
1,a,b,c 2,c 3,c 5,c
file2
1,x,y 2,y 5,y 6,y 7,y
desired output
1,c,y 3,5,y
解决方法
$cat tst.awk BEGIN { FS=OFS="," } NR==FNR { tail = gensub(/[^,]*,/,1) if ( FNR == 1 ) { empty = gensub(/[^,]/,"g",tail) } file2[$1] = tail next } { print $0,($1 in file2 ? file2[$1] : empty) } $awk -f tst.awk file2 file1 1,y
上面使用GNU awk for gensub(),与其他awks一起,它只是在最初分配后在适当的变量上执行[g] sub()的又一步.
您可能想要测试性能差异的一个有趣的(至少对我来说)替代方案是:
$cat tst.awk BEGIN { FS=OFS=",1) idx[$1] = NR file2[NR] = tail if ( FNR == 1 ) { file2[""] = gensub(/[^,tail) } next } { print $0,file2[idx[$1]] } $awk -f tst.awk file2 file1 1,y
但我真的不希望它更快,甚至可能更慢.
bash – 使用命令行工具计算文件中的行长度
如果我有一个长文件包含许多不同长度的行,我如何计算每行长度的出现次数?
例:
file.txt
this is a sample file with several lines of varying length
运行count_line_lengths file.txt将给出:
Length Occurences 1 1 2 2 4 3 5 1 6 2 7 2
想法?
{ print length($0); }
… …
$ awk -f count.awk input.txt | sort | uniq -c 1 1 2 2 3 4 1 5 2 6 2 7
关于bash – 在两个文件中计算相等的行数的问题我们已经讲解完毕,感谢您的阅读,如果还想了解更多关于AWK / BASH:如何匹配一个文件中的字段与另一个文件中的字段?、bash – 从另一个文件中的一个文件中删除行、bash – 使用awk如何合并2个文件,比如A&B并执行左外连接功能并包含两个文件中的所有列、bash – 使用命令行工具计算文件中的行长度等相关内容,可以在本站寻找。
本文标签: