![从多个文件中过滤特定数字](https://linux22.com/image/138952/%E4%BB%8E%E5%A4%9A%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E8%BF%87%E6%BB%A4%E7%89%B9%E5%AE%9A%E6%95%B0%E5%AD%97.png)
我有多个文件(大约 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