다음과 같은 여러 파일(약 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