【问题标题】:Finiding common lines for two files using bash使用 bash 查找两个文件的公共行
【发布时间】:2021-08-27 22:35:56
【问题描述】:

我正在尝试比较两个文件并输出一个包含两者通用名称的文件。

文件1

1990.A.BHT.s_fil 4.70 
1991.H.BHT.s_fil 2.34 
1992.O.BHT.s_fil 3.67 
1993.C.BHT.s_fil -1.50
1994.I.BHT.s_fil -3.29 
1995.K.BHT.s_fil -4.01

文件2

1990.A.BHT_ScS.dat 1537  -2.21
1993.C.BHT_ScS.dat 1494  1.13
1994.I.BHT_ScS.dat 1545  0.15
1995.K.BHT_ScS.dat 1624  1.15 

我想比较两个文件上名称 ** (ex:1990.A.BHT ) ** 的第一部分,并输出一个具有通用名称的文件,该文件具有 file1 到 file3 中第二列的值

例如:file3(输出)

1990.A.BHT.s_fil 4.70 
1993.C.BHT.s_fil -1.50
1994.I.BHT.s_fil -3.29
1995.K.BHT.s_fil -4.01

我使用了以下使用 grep 命令的代码

while read line 
do
grep $line file1 >> file3
done < file2

grep -wf file1 file2 > file3 

我在使用这个脚本之前对文件进行了排序。 但我得到一个空的file3。有人可以帮我解决这个问题吗?

【问题讨论】:

  • 两个文件中的行都不匹配。 file1 有 2 列,file2 有 3 列。 file1 中的第一列以.s_fil 结尾,而file2 中的相应名称以.dat 结尾。
  • 您只想比较没有这些后缀的名称吗?您编写的所有代码都不会删除后缀,只是比较该字段。
  • 您尝试使用的所有工具都需要行的精确匹配,您似乎没有尝试只检查您关心的部分。
  • @Barmar 是的,我想比较没有后缀的名称并将 file1 值输出到 file3
  • 那么你有什么尝试?您发布的代码显然不是这样做的尝试。

标签: bash sorting grep comm


【解决方案1】:

在您的示例数据中,这些行似乎是按排序顺序排列的。如果您可以保证它们始终如此,comm -1 -2 file1 file2 将完成这项工作。如果它们可以未排序,请执行

comm -1 -2 <(sort file1) <(sort file2)

【讨论】:

  • 当行实际上不匹配时,这怎么可能工作,只有第一个字段的开头匹配?这与 OP 犯的错误相同。
【解决方案2】:

您需要从file2 的行中删除从_SCS.dat 开始的所有内容。然后,您可以将其用作匹配 file1 中的行的模式。

grep -F -f <(sed 's/_SCS\.dat.*//' file2) file1 > file3

-F 选项匹配固定字符串,而不是将它们视为正则表达式。

【讨论】:

  • @Monika 如果它解决了您的问题,请接受答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-25
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多