여러 파일에서 특정 번호 필터링

여러 파일에서 특정 번호 필터링

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

관련 정보