【问题标题】:Comparing two files, if string exists in file 1, print 2 and if not print 1比较两个文件,如果文件 1 中存在字符串,则打印 2,如果不存在则打印 1
【发布时间】:2021-10-25 22:04:53
【问题描述】:

我有两个文件要比较。如果文件 1 中存在字符串(只有一列),我想在它旁边打印一个 2。如果它只存在于文件 2 中,我想在它旁边打印一个 1。我想保留文件 2 的所有条目。

文件 1:

5131885
5751191 

文件 2:

5131885 1000019 -0.013936 0.0069218 -0.0048443 -0.0053688 0.0074161
5751191 1000046 -0.015001 0.0015263 0.00039903 0.0017072 -0.0021732
1668460 1000081 0.026323 0.0068929 0.0048965 0.0077047 0.0061728

文件 3(所需输出):

5131885 2 1000019 -0.013936 0.0069218 -0.0048443 -0.0053688 0.0074161
5751191 2 1000046 -0.015001 0.0015263 0.00039903 0.0017072 -0.0021732
1668460 1 1000081 0.026323 0.0068929 0.0048965 0.0077047 0.0061728 

我尝试用 awk 来做,但没有成功。 我达到了这一点:

awk 'FNR==NR{arr[$1]=$1;next} ($1 in arr){print $0,arr[$1]}' file2 file1 > file3

但它不会添加额外的列。

【问题讨论】:

  • 还有其他问题,但你当然想交换参数的顺序:先处理file1,然后处理file2

标签: awk text-processing


【解决方案1】:

使用您展示的示例,请尝试关注awk 代码。

awk 'FNR==NR{arr[$0];next} {$1=$1 OFS ($1 in arr?2:1)} 1' file1 file2

说明:为上述添加详细说明。

awk '              ##Starting awk program from here.
FNR==NR{           ##Checking condition if FNR==NR which will be TRUE when file1 is being read.
  arr[$0]          ##Creating arr with index of current line value here.
  next             ##next will skip all further statements from here.
}
{
  $1=($1 in arr)?$1 OFS 2:$1 OFS 1 ##Checking if $1 from file2 is present in arr then add 2 to it else add 1 to it.
}
1                  ##Printing current edited/non-edited line here.
' file1 file2      ##Mentioning Input_file names here.

@Kaz 在 cmets 中建议的上述解决方案的一个小变体尝试以下操作:

awk 'FNR==NR{arr[$0];next} $1=$1 OFS ($1 in arr?2:1)' file1 file2

【讨论】:

  • 这很好!现在,我们可以在第一个操作中只使用print,而不是添加1。另一方面,如果你想对它进行编码,你可以从第二个动作中去掉大括号。 FNR==NR{arr[$0];next} $1=($1 in arr)?$1 OFS 2:$1 OFS 1。赋值本身为您提供触发打印操作的真实值。
  • 我听到代码高尔夫了吗? NR==FNR{a[$1];next}$1=$1 OFS ($1 in a)+1
  • 始终寻找通用代码以排除表达式。 $1 = ($1 in arr)?$1 OFS 2:$1 OFS 1 应缩写为 $1 = $1 OFS ($1 in arr ? 2 : 1)。恕我直言,使用该操作的结果作为导致 awk 打印当前行的条件,只是不必要地混淆了代码,并导致阅读它的人想知道为什么您关心该条件而不是无条件打印并寻找条件将是的情况假的。
  • @JamesBrown,你用的这个技巧真的很酷,谢谢分享,干杯。
  • @EdMorton,谢谢先生,我现在已经编辑了我的答案。
【解决方案2】:

反转文件1和文件2:文件1的记忆

提取第一个字段 (k)。

删除第一个字段(子)。

检测记忆文件 1 中的 k 是否影响 n(1 或 2)。

打印 k、n 和 file2 行的其余部分(不包括 k)。

awk 'FNR==NR{arr[$1]=$1;next} {k=$1; sub(/^[^ ]+ /, ""); n=1} (k in arr){n=2} {print k " " n " " $0}' file1 file2

【讨论】:

    猜你喜欢
    • 2014-08-28
    • 2021-10-11
    • 2019-11-11
    • 2014-03-30
    • 2013-04-07
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多