我有两个文件:
FILE1.TXT
919167,hutch,mumbai
919594,idea,mumbai
FILE2.TXT
919167000000
919594000000
输出
919167000000,hutch,mumbai
919594000000,idea,mumbai
如何使用AWK实现这一目标?我有一个庞大的电话号码文件需要像这样比较。我相信Awk可以处理它;如果没有,请让我知道我该怎么做。
FILE1.TXT
919167,hutch,mumbai
919594,idea,mumbai
918888,airtel,karnataka
FILE2.TXT
919167838888
919594998484
919212334323
预期输出:
919167838888,hutch,mumbai
919594998484,idea,mumbai
919212334323,nomatch,nomatch
答案 0 :(得分:2)
正如我在评论中所指出的那样,需要提供大量未说明的信息才能给出明确的答案。但是,我们可以做出一些看似合理的猜测:
选择的工具可能是sed
和join
:
sed 's/^\([0-9]\{6\}\)/\1,\1/' file2.txt |
join -t, -o 1.2,2.2,2.3 - file1.txt
这会编辑file2.txt
以创建逗号分隔的第一个字段,其中包含6位数的电话号码,然后是该行的其余部分。输入被输入join
命令,该命令连接到第一列,并输出file2.txt
的“其余部分”(第2列)以及file1.txt
的第2列和第3列
如果电话号码是可变长度的,那么匹配操作非常复杂。为此,我将进入Perl(或Python)来完成工作。如果数据未排序,则可以在输入命令之前对其进行排序。如果您想要不匹配的记录,可以指定如何处理join
的选项中的那些。
现在可以获得所需的额外信息。关键信息是固定的6位数 - p!由于您使用的是Linux,我假设bash
可用“进程替换”:
sort file2.txt |
sed 's/^\([0-9]\{6\}\)/\1,\1/' |
join -t, -o 1.2,2.2,2.3 -a 1 -a 2 -e 'no-match' - <(sort file1.txt)
如果没有流程替换,只需在原地排序file1.txt
:
sort -o file1.txt file1.txt
然后使用file1.txt
代替<(sort file1.txt)
。
我认为评论可能会要求输入,例如:
919167,hutch,mumbai
919594,idea,mumbai
902130,airtel,karnataka
919167000000
919594000000
919342313242
no-match,airtel,karnataka
919167000000,hutch,mumbai
919342313242,no-match,no-match
919594000000,idea,mumbai
如果这不是评论的内容,请通过编辑问题来澄清,以便以比评论允许的更易读的格式添加额外的数据和输出。
使用扩展数据,这个经过温和修改的命令:
sort file2.txt |
sed 's/^\([0-9]\{6\}\)/\1,\1/' |
join -t, -o 1.2,2.2,2.3 -a 1 -e 'no-match' - <(sort file1.txt)
产生输出:
919167838888,hutch,mumbai
919212334323,no-match,no-match
919594998484,idea,mumbai
看起来更像是所需输出的排序版本。 -a n
选项控制是否打印来自文件1或文件2(或两者)的不匹配记录; -e
选项控制为不匹配的字段打印的值。当然,所有这些都可以从join
的手册页中获得。
答案 1 :(得分:2)
这是使用GNU awk
的单向方式。像:
awk -f script.awk file2.txt file1.txt
script.awk
的内容:
BEGIN {
FS=OFS=","
}
FNR==NR {
sub(/[ \t]+$/, "")
line = substr($0, 0, 6)
array[line]=$0
next
}
{
printf ($1 in array) ? $0"\n" : "FILE1 no match --> "$0"\n"
dup[$1]++
}
END {
for (i in array) {
if (!(i in dup)) {
printf "FILE2 no match --> %s\n", array[i]
}
}
}
或者,这里是单行:
awk 'BEGIN { FS=OFS="," } FNR==NR { sub(/[ \t]+$/, ""); line = substr($0, 0, 6); array[line]=$0; next } { printf ($1 in array) ? $0"\n" : "FILE1 no match --> "$0"\n"; dup[$1]++} END { for (i in array) if (!(i in dup)) printf "FILE2 no match --> %s\n", array[i] }' file2.txt file1.txt
答案 2 :(得分:0)
awk -F, 'FNR==NR{a[$1]=$2","$3;next}{for(i in a){if($1~/i/) print $1","a[i]}}' your_file