【问题标题】:Extracting columns from data file based on header using a header file使用头文件根据标题从数据文件中提取列
【发布时间】:2016-08-20 02:27:56
【问题描述】:

我有一个大数据文件(不是 csv),其中包含许多带有标题行的列。列标题是包含字母和数字的字符串。如果标题存在于第二个文件中,我想编写一个脚本,根据标题提取数据列。我研究了这个问题,并根据AWK extract columns from file based on header selected from 2nd file 的答案编写了一个脚本。我理解它的大部分功能,但我承认我并不完全理解它。我知道它是为 csv 文件设计的......我尝试将它与我的文件一起使用,但我无法让它工作。这是代码(包含在 bash 脚本中):

(注意:$motif_list 和 $affinity_matrix 是两个文件的路径,之前已在 bash 脚本中定义)

 43 awk -v motif_list="$motif_list" -v affinity_matrix="$affinity_matrix" '
 44         BEGIN {
 45                 j=1
 46                 while ((getline < motif_list) > 0)
 47                 {
 48                         col_names[j++] = $1
 49                 }
 50                 n=j-1;
 51                 close(motif_list)
 52                 for (i=1; i<=n; i++) s[col_names[i]] = i
 53               }       
 54 
 55         NR==1 {
 56                 for (f=1; f<=NF; f++)
 57                         if ($f in s) c[s[$f]]=f
 58                 next
 59               }
 60 
 61         {
 62                 sep=" "
 63                 for (f=1; f<=n; f++)
 64                         {
 65                                 printf("%c%s",sep,$c[f])
 66                                 sep=FS
 67                         }
 68                 print " "
 69         }' "$affinity_matrix" > $affinity_columns

(我也将分隔符从“”更改为“”,但这可能不是正确的做法)

例如,这里是示例输入和输出表:

输入:

A   B   C   D   E   F
1   2   3   4   5   6
1   2   3   4   5   6
1   2   3   4   5   6
1   2   3   4   5   6
1   2   3   4   5   6

输出:

A   C   
1   3   
1   3   
1   3   
1   3   
1   3   

任何意见将不胜感激!

谢谢

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    一般方法(未经测试,因为您没有提供任何示例输入/输出)是:

    awk '
    NR==FNR { names[$0]; next }
    FNR==1 {
        for (i=1;i<=NF;i++) {
            if ($i in names) {
                nrs[i]
            }
        }
    }
    {
        c = 0
        for (i=1;i<=NF;i++) {
            if (i in nrs) {
                printf "%s%s", (c++ ? OFS : ""), $i
            }
        }
        if (c) {
            print ""
        }
    }
    ' motif_list affinity_matrix
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-15
      相关资源
      最近更新 更多