我有一个包含多个文件的目录,我们将其称为1.txt,2.txt等。每个文件包含3列:ID,lat和lon。不幸的是,某些ID也可能已编号(例如1346、248、67912等)。我正在尝试计算基于主文件(masterfile.txt)的所有文件(1.txt,2.txt等)中站ID发生的实例数。到目前为止,我有:
while IFS='' read line || [[ -n "$line" ]]
do
cat * | grep -w -c $line >> counting_filename.txt
done < masterfile.txt
哪个效果很好。但是,如果经纬度和/或经度包含特定的ID,这也将算在内。例如,如果我要查找4575的站点ID,如果有“ 47.4575”的纬度或“ -77.4575”的经度,则这些也将计入计数。因此,有两种我无法解决的解决方案:
1)只需grep实例的第一列,或者
2)grep,但不包括前导“。”
例如:
1.txt
4575 39.4575 -77.51
5010 38.3498 -78.4575
LAMS 38.4444 -78.3126
2.txt
3124 39.1010 -79.4575
4575 39.4575 -77.5010
PAOQ 39.2222 -78.0032
如果运行上述命令,则4575的计数为6,5010的计数为2,LAMS的计数为1,3124的计数为1,PAOQ的计数为1。
期望的是:2代表4575,1代表5010,1代表LAMS,1代表3124,1代表PAOQ。
有什么想法吗?
答案 0 :(得分:0)
您使用了错误的工具-一个小的,简单的awk脚本比混合使用shell循环,读取,grep等会更健壮,高效且可移植。
目前尚不清楚masterfile.txt是做什么用的,因为从您的示例看来,这就是您所需要的:
$ awk '{cnt[$1]++} END{for (id in cnt) print id, cnt[id]}' 1.txt 2.txt
LAMS 1
PAOQ 1
3124 1
4575 2
5010 1
如果您需要masterfile.txt列出一组特定的ID,而不仅仅是像上面那样为所有ID生成计数,那么您也可以这样做:
$ cat masterfile.txt
4575
3124
PAOQ
BLAH
$ awk 'NR==FNR{ids[$1];next} $1 in ids{cnt[$1]++} END{for (id in cnt) print id, cnt[id]}' masterfile.txt 1.txt 2.txt
PAOQ 1
3124 1
4575 2
$ awk 'NR==FNR{ids[$1];next} $1 in ids{cnt[$1]++} END{for (id in ids) print id, cnt[id]+0}' masterfile.txt 1.txt 2.txt
BLAH 0
PAOQ 1
3124 1
4575 2
我添加了BLAH,以显示处理来自masterfile.txt的ID的其他选项,这些选项不会出现在其他文件中。