【问题标题】:Use part of a column in one file as search term in other file使用一个文件中的部分列作为另一个文件中的搜索词
【发布时间】:2016-11-07 21:29:38
【问题描述】:

我有两个文件。我正在搜索的输出文件有地震位置,格式如下:

19090212 1323 30.12 36 19.41 103 28.24   7.29   0.00  4 149 25.8 0.02  5.7  9.8 D -         0
19090216 1828 49.61 36 13.27 101 35.38  10.94   0.00 13  54 38.5 0.07  0.3  0.7 B           0
19090711 2114 54.11 35  1.07  99 56.42   7.00   0.00  7 177 18.7 4.00 63.3 53.2 D #         0

我想使用第一列的后 6 位数字(即“19090418”中的“090418”)和第二列的前 3 位数字(即“0728”中的“072”)作为我的搜索词.我正在搜索的文件格式如下:

SC17 P   090212132329.89
X25A P   090212132330.50

AMTX P   090216182814.12
X29A P   090216182813.70
Y28A P   090216182822.36
MSTX P   090216182826.80
Y27A P   090216182831.43

在第二个文件中搜索该术语后,我需要弄清楚该部分中有多少行。所以对于这个例子,如果我正在搜索上面第二个文件显示的术语,我想知道 090212132 有 2 行,090216182 有 5 行。

这是我的第一篇文章,所以请告诉我如何提高我的文章的清晰度或简洁性。感谢您的帮助!

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 预期的结果是什么?
  • 您的第一个文件不包含第二个文件的任何部分。请修正你的例子。暂时没有输出:grep -f <(cut -b 3-8,10-12 file1) file2
  • 您可以添加带有一些常见数据元素的输入文件,以便脚本具有真实的输出。
  • 抱歉文件示例不匹配。我从文件的不同部分复制。这个例子现在应该更有意义了。感谢您指出这一点。

标签: linux bash shell awk grep


【解决方案1】:

awk 来救援!

$ awk 'NR==FNR{a[substr($1,3) substr($2,1,3)]; next} 
              {k=substr($3,1,9)} 
        k in a{a[k]++} 
           END{for(k in a) if(a[k]>0) print k,a[k]}' file1 file2

对于您的输入文件,没有预期的输出。

【讨论】:

  • 我理解了其中的一部分...比如读取文件并将内容存储在数组a中...提取第二个文件$3 in k...什么是k in a{a[k]++}..跨度>
【解决方案2】:

karakfa 建议的答案有效!我的输出如下所示:

100224194 7
100117172 18
091004005 11
090520220 10
090526143 21
090122033 20

感谢您的帮助!

【讨论】:

  • 谢谢!完毕。 @JayRajput
【解决方案3】:

Karafka 用解释回答

awk 'NR==FNR {               # For first file
     $1 = substr($1, 3);     # Get last  6 characters from first col
     $2 = substr($2, 1, 3);  # Get first 3 characters from second col
     a[$1 $2];               # Add to an array
     next }                  # Move to next record in first file

                             # Start processing second file
    {k = substr($3, 1, 9)}   # Get first 9 character for third col
    k in a {a[k]++}          # If key in a, then increment the key

    END {
      for (k in a)           # Iterate array
        if (a[k] > 0)        # If pattern was matched
           print k, a[k]     # print the pattern and num occurrence
    }'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多