从多个文件中过滤特定数字

从多个文件中过滤特定数字

我有多个文件(大约 150),如下所示:

reconstructed_hap_4_Local_nt_haplo_freq_60.3 GGGCAACTGGGCCAAGGTCGCTATCATCATGGTTATGTTTTCAGGGGTCGATGCCAATACATATATCACCGGTGGCAAAGCAGCTCAAACTGCCAGAGGCCTTGTTGGCTGGTTTAATCCGGGTCCCAAACAGAACCTGCAGCTGGTCAACACCAATGGCTCGTGGCA
reconstructed_hap_6_Local_nt_haplo_freq_37.2 GGGCAACTGGGCCAAGGTCGCTATCATCATGGTTATGTTTTCAGGGGTCGATGCCGAAACATATGCCTCCGGTGGCAGTGCAGCTCGTAATACCTG-GGCCTTTCTAGCTTGTTTAGTTCGGGTCCCAAACAGAGCCTGCAGCTGGTCAACACCAATGGCTCGTGGCA
reconstructed_hap_1_Local_nt_haplo_freq_0.6 GGGCAACTGGGCCAAGGTCGCTATCATCATGGTTATGTTTTCAGGGGTCGATGCCAATACATATATCACCGGTGGCAAAGCAGCTCAAACTGCCAGAGGCCTTGTTTGGCTGTTTAATCCGGGTCCCAAACAGAACCTGCAGCTGGTCAACACCAATGGCTCGTGGCA

每个文件都有不同的行数。

我想从“freq_”之后的标题行中过滤每个文件的数字

在此示例中,我想过滤:60.3, 37.2, 0.6

最优选的输出应该是包含每个样本名称的 CSV 文件

Filename1   60.3    37.2    0.6 
Filename2   56.1    26.2    52.3    42.1
Filename3   2.5     1.2

你有什么解决办法?

答案1

尝试这个,

cd /path/to/directory
for i in `ls`
do
        VALUE=`awk '{print $1}' $i | awk -F '_' '{print $NF}' | tr '\n' '\t'`
        echo -e "$i\t$VALUE" 
done

答案2

使用 GNU Awk:

awk '
  BEGINFILE {i=0} 
  {
    n=split($1,a,"_")
    freqs[i++] = a[n]
  } 
  ENDFILE {
    printf FILENAME
    for (j=0;j<i;j++) printf("\t%s", freqs[j])
    printf "\n"
    delete freqs
  }
' Filename*

前任。

$ awk 'BEGINFILE{i=0;} {n=split($1,a,"_"); freqs[i++] = a[n]} ENDFILE{printf FILENAME; for (j=0;j<i;j++) printf("\t%s", freqs[j]); printf "\n"; delete freqs}' Filename*
Filename1   60.3    37.2    0.6
Filename2   56.1    26.2    52.3

答案3

外壳脚本:

for file_number in {1..150}
do
        data=$( cat file${file_number}.txt | cut -f1 -d' ' | cut -f8 -d'_' | tr '\n' '\t' )
        #echo $data
        file_name="file${file_number}.txt"
        content="$file_name     $data"
        #echo $content
        echo $content >> result.csv
done

result.csv文件包含预期的结果。

编辑:下面的代码更好

#!/bin/bash
FILES=/path/to/directory
for file in $FILES
do
        data=$( cat $file | cut -f1 -d' ' | cut -f8 -d'_' | tr '\n' '\t' )
        content="$file  $data"
        echo $content >> result.csv
done

解释

FILES包含所有输入文件。使用cut命令我们获取字段(其中包含浮点数)。使用tr我们将选项卡替换为新行。 result.csv文件包含您的预期结果。

答案4

使用 GNU awk(扩展命令):

awk -F '[ _]' '
               /^[^ ]*_[^ _]* /{
                                 a[FILENAME]=a[FILENAME] " " $(NF-1)
                               }
               END{
                   for(i in a){print i,a[i]}
                  }
              ' Filename*

可以作为单行执行:

$ awk -F '[ _]' '/^[^ ]*_[^ _]* /{a[FILENAME]=a[FILENAME] " " $(NF-1)}END{for(i in a){print i,a[i]}}' Filename*

Filename1   60.3    37.2    0.6
Filename2   56.1    26.2    52.3

相关内容