여러 파일의 열을 살펴보고 단일 텍스트 파일에 추가

여러 파일의 열을 살펴보고 단일 텍스트 파일에 추가

9개의 열을 포함하는 50개의 파일 세트가 있습니다(첨부된 그림에 표시된 예).

여기에 이미지 설명을 입력하세요.

파일 이름은 (1) inputfile_1.assoc.logistic (2) inputfile_2.assoc.logistic 등…입니다.

1, 2, 3열의 값은 50개 파일 모두 동일합니다.

50개 파일 전체에서 7,8,9열을 수집하고 아래와 같이 단일 .txt 파일에 추가할 수 있기를 원합니다. 필드는 탭으로 구분되어 있고 7,8,9열에는 표시된 대로 레이블이 지정되어 있습니다.

여기에 이미지 설명을 입력하세요.

나는 grep 루프(아래 참조)를 사용하여 열을 개별적으로 추출하고, 텍스트 파일로 저장하고, .txt 파일을 stata로 가져와서 병합했지만 시간이 꽤 오래 걸렸습니다(행이 700만 개 이상이므로). 및 I 이를 위해서는 여러 가지 분석이 필요했습니다.

for i in $(seq 1 50); do
    gawk -F" " '{print $2, $7, $8, $9}' inputfile_${i}.assoc.logistic >>/mnt/jw01-aruk-home01/projects/jia_mtx_gwas_2016/common_files/output/imputed_dataset/all_50_mi_datasets/acr30R_vs_acr30NR_combined_coefficients/outputfile_${i}.txt
done

이것이 더 효율적으로 만들어지고 쉘 루프에 통합될 수 있습니까?

답변1

입력 데이터 부족으로 인해 테스트되지 않았습니다.

gawk '
    BEGIN {FS = OFS = "\t"}
    BEGINFILE {match(FILENAME, /inputfile_([0-9]+).assoc.logistic/, m)}
    FNR == 1 {
        key = $1 OFS $2 OFS $3
        data[key] = data[key] OFS $7"_"m[1] OFS $8"_"m[1] OFS $9"_"m[1]
        next
    }
    {
        key = $1 OFS $2 OFS $3
        data[key] = data[key] OFS $7 OFS $8 OFS $9
    }
    END {
        for (key in data) {
            print key data[key]
        }
    }
' inputfile_*.assoc.logistic > outputfile

데이터를 출력하기 위해 해시 키를 반복하므로 출력은 무작위 순서로 나타납니다.

관련 정보