我的剧本中有些麻烦。
我目前正在使用:
awk '{anum=substr($1,3,22); sub(/^0+/, "", anum); print anum}' file1 | grep -nf file2 | cut -d: -f1 | awk 'FNR==NR{a[$1];next};FNR in a' - file1
文件1
5000000000009855892590xxxx xxx
5000000000000068582654xxxx xxx
5000000000009855892580xxxx xxx
5000000000000765432100xxxx xxx
file2的
9855892588
985589259
8265
76543210
我使用下面的两个文件(file1和file2)获取输出:
5000000000009855892590xxxx xxx
5000000000000068582654xxxx xxx
5000000000000765432100xxxx xxx
但我的预期输出只是:
5000000000009855892590xxxx xxx
5000000000000765432100xxxx xxx
我的问题是它在 5000000000000068582654xxxx 的中间捕获 8265 ,这是错误的。还有什么可以用来代替grep -nf来满足我的条件? file2中的数字是否应与file1的第3位到第22位的前缀或整数相匹配(不带前导零)。
答案 0 :(得分:2)
这适用于您的示例,但由于我并不确定您是如何确定有效的,因此它可能不是很强大。
gawk 'NR==FNR{a[$1]=$1;next}{match($0,/0+([1-9][0-9]+)0/,b)}a[b[1]]' file{2,1}
5000000000009855892590xxxx xxx
5000000000000765432100xxxx xxx
它会在第一个文件(file2)中创建一个包含所有第一个字段的数组,然后在第二个文件中匹配我猜到的字符串是您的有效字符串。接下来,如果字符串已保存在数组中,则会打印该行。
不是gawk版
awk 'NR==FNR{a[$1]=$1;next}{n=substr($1,3,22);sub(/^0+/, "", n)
for(i in a)if(n~"^"a[i])print}' test2 test
与另一个相同的开始,然后在OP完成后删除行的开头,接下来为每个保存的元素,检查新创建的行是否以它开头。