【问题标题】:Find if a row exists in a file and add a column with the filename using awk?查找文件中是否存在行并使用awk添加具有文件名的列?
【发布时间】:2019-09-02 19:22:59
【问题描述】:

这里我问了同样的问题,得到了正确答案:How can I find if a row exists in a file and add a column with the filename using awk?

按照@RavinderSingh13 的建议,我打开了这个新帖子,提供了更多详细信息。

我有一个像这样的文件作为数据库(db_file.txt):

  CHROM  POS REF ALT
  chr1   10  T   A
  chr1   12  T   G
  chr1   12  T   C

还有大量文件,我需要检查数据库文件中是否已经存在一行。如果存在一行,我必须添加一个带有文件名的新列。

两个文件的例子

文件1:

  CHROM  POS REF ALT          
  chr1   10  T   A                                   
  chr1   13  T   C              

文件2:

    CHROM  POS REF ALT
     chr1   12  T   G  
     chr1   10  T   A

预期输出:

  CHROM  POS REF ALT
  chr1   10  T   A   file1   file2
  chr1   12  T   G   file2
  chr1   12  T   C    

我正在尝试使用此代码,但我没有得到我需要的东西:

 for i in `ls directory`;do

      awk 'FNR==1 && FNR==NR{print;next}

      FNR==NR{a[$0]=FILENAME;next}FNR>1{

      print $0,$0 in a?OFS a[$0]:""}' $i $directory/db_file.txt

  done

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    哈希记录加上它们在读取file1file2 等时在数组中出现的文件名的次数,并在处理db_file.txt 时使用它来更新记录。 $1=$1 是用来挤空间的,如果没必要就放弃吧。

    awk '{$1=$1} FILENAME!="db_file.txt"{a[$0,++n[$0]]=FILENAME;next}
    FNR>1{r=$0;for(i=1;i<=n[r];++i) $(NF+1)=a[r,i]}1' file{1,2} db_file.txt
    

    【讨论】:

    • 嗨@oguzismail!非常感谢您的回答以及您对我的 awk 问题的帮助。 ++n[$0] 有什么作用?
    • @Marta_ma 不客气。它计算重复; n[$0] 为每个重复增加 1,以便我们知道有多少文件具有相同的记录
    • 我正在尝试在 for 循环中运行脚本,因为我有多个目录和文件,但它不起作用,它不输出任何东西......你看到有什么问题吗编码?所有变量都先前在我的脚本中定义。 for i in ls $TSO;do awk -F="\t" '{$1=$1} FILENAME!="variants_database.txt"{a[$0,++n[$0]]=FILENAME;next} FNR&gt;1{r=$0;for(i=1;i&lt;=n[r];++i) $(NF+1)=a[r,i]}1' OFS="\t" $TSO/$i/$vcf/*raw.vcf $DB done
    • 引号和星号的问题。实际上,它已经部分解决了。我不能使用变量来定义文件的路径,但是用它的值替换变量,它可以工作
    猜你喜欢
    • 2017-07-09
    • 1970-01-01
    • 1970-01-01
    • 2023-01-07
    • 1970-01-01
    • 1970-01-01
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多