【问题标题】:Extracting same column from each file to one file从每个文件中提取相同的列到一个文件
【发布时间】:2020-12-10 22:12:23
【问题描述】:

我有以下包含 171 个文件的数据集。

CHR:POS   REF:ALT   BREED

6:85406127 T:A 0.333333
6:85406128 T:C 0
6:85406129 C:G 0.333333
6:85406130 T:G 0.833333

想要的输出是

CHR:POS   REF:ALT   BREED BREED2 BREED3 ... 171st file

6:85406127 T:A 0.333333 0.33 0.5 .... 0.4
6:85406128 T:C NA 0.33 0.5 .... 0.4
6:85406129 C:G 0.333333 0.33 NA .... 0
6:85406130 T:G 0.833333 0.33 0.5 .... NA

文件名包含品种名称。第一列和第二列在每个文件中都包含相同的信息。如何仅从每个文件中提取第三列,同时保留第一个文件中的所有列?

我将第一个文件移动到其他文件夹以从提取中排除。下面的命令没有给出结果。

cut -d " " -f3 *.txt | paste ../breedname.txt - > output.txt

我也尝试过使用这些问题中显示的 awk 命令,但它不适用于我的数据集。

欢迎任何帮助!

【问题讨论】:

  • 欢迎来到 SO 并特别感谢您展示您的尝试,继续努力。您能否确认一下您所有文件的 1st 2 字段是否相同?
  • 感谢您的盛情款待!是的,每个文件中的第一个和第二个字段都是相同的。

标签: awk paste cut


【解决方案1】:

这是一种非常快速而肮脏的方法:

假设您的文件顺序相同:

$ awk '(FNR==NR){a[FNR]=$0;next}
       {a[FNR]=a[FNR] FS $NF}
       END{for(i=1;i<=FNR;++i) print a[i]}' file1 file2 file3 ... filen

如果你想让标题更干净一点:

$ awk '(FNR==NR){a[FNR]=$0 (FNR==1?++c:"");next}
       {a[FNR]=a[FNR] FS $NF (FNR==1?++c:"")}
       END{for(i=1;i<=FNR;++i) print a[i]}' file1 file2 file3 ... filen

假设您的文件顺序不同:

$ awk '{key=$1 FS $2}
       (FNR==NR){a[key]=$0 (FNR==1?++c:"");next}
       {a[key]=a[key] FS $NF (FNR==1?++c:"")}
       END{for(i in a) print a[i]}' file1 file2 file3 ... filen

【讨论】:

    【解决方案2】:

    我会这样做:

    paste -d " " *.txt | awk '{printf "%s %s ",$1,$2; for (i = 3; i <= NF; i+=3){printf "%s ",$i} print ""}'
    

    paste 垂直连接行,因此您可以让每一列彼此相邻。之后,您只需选择所需的列。

    【讨论】:

    • 感谢您的命令!第三列中的值不会显示在输出中。输出只有第一个文件的第三列的重复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-27
    • 2020-09-27
    • 2013-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多