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
데이터를 출력하기 위해 해시 키를 반복하므로 출력은 무작위 순서로 나타납니다.