![루프를 사용하여 테이블에서 열 추출](https://linux55.com/image/14562/%EB%A3%A8%ED%94%84%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%85%8C%EC%9D%B4%EB%B8%94%EC%97%90%EC%84%9C%20%EC%97%B4%20%EC%B6%94%EC%B6%9C.png)
나는 이 매트릭스를 가지고 있습니다.
#chr st start PM1_r1 PM2_r1 PM3_r1 PM1_r2 PM2_r2 PM3_r2
chr1 - 10625 0 0 0 0 0 0
chr1 + 16616 0.10217712 0 0 1 0 0
chr1 - 120482 0 0 0.50105411 0 0 1
chr1 - 247355 0 0 0.50105411 0 0 1
chr1 + 535689 0.10217712 0 0 1 0 0
#삽입할 추가 열
file4=formatedFile1
file5=formatedFile2
file6=formatedFile3
이 명령으로 원하는 출력을 얻으십시오.
awk 'BEGIN {OFS="\t"} { print $1,$2,$3,$4,$7,"'$file4'" }' file
chr1 - 10625 0 0 formatedFile1
chr1 + 16616 0.10217712 1 formatedFile1
chr1 - 120482 0 0 formatedFile1
chr1 - 247355 0 0 formatedFile1
chr1 + 535689 0.10217712 1 formatedFile1
awk 'BEGIN {OFS="\t"} { print $1,$2,$3,$5,$8,"'$file5'" }' filename
chr1 - 10625 0 0 formatedFile2
chr1 + 16616 0 0 formatedFile2
chr1 - 120482 0 0 formatedFile2
chr1 - 247355 0 0 formatedFile2
chr1 + 535689 0 0 formatedFile2
awk 'BEGIN {OFS="\t"} { print $1,$2,$3,$6,$9,"'$file6'" }' file
chr1 - 10625 0 0 formatedFile3
chr1 + 16616 0 0 formatedFile3
chr1 - 120482 0.50105411 1 formatedFile3
chr1 - 247355 0.50105411 1 formatedFile3
chr1 + 535689 0 0 formatedFile3
값은 4열부터 6열까지입니다. Round2 값은 7열부터 9열까지입니다. 파일이 너무 길어서 루프를 사용하고 싶습니다.
file4=formatedFile1
file5=formatedFile2
file6=formatedFile3
recurrenceCol=3
for col in 4 5 6
do
col1=$col
col2=$((col+recurrenceCol))
echo $col1
echo $col2
id="file"$col
out=out"$ID"
awk 'BEGIN {OFS="\t"} { print $1,$2,$3,$'$col1', $'$col2', "'$ID'" }' file
done
스크립트는 열 6의 파일 이름을 인쇄하지 않기 때문에 원하는 출력을 제공하지 않습니다. 열 6 값 file4는 File1 형식이어야 합니다.
스크립트의 출력입니다.
chr1 - 10625 0 0 file4
chr1 + 16616 0.10217712 1 file4
chr1 - 120482 0 0 file4
chr1 - 247355 0 0 file4
chr1 + 535689 0.10217712 1 file4
chr1 - 10625 0 0 file5
chr1 + 16616 0 0 file5
chr1 - 120482 0 0 file5
chr1 - 247355 0 0 file5
chr1 + 535689 0 0 file5
등.
답변1
거의 다 왔습니다. 여러분이 놓친 것은 indirection operator ${!varname}
varname에 있는 변수의 값을 인쇄하는 bash를 사용하는 것입니다.
또한 awk 코드에서 쉘 변수를 사용하는 정식|올바른 방법은 해당 -v awkvar=shell_data
변수를 awk 문에 직접 삽입하는 것입니다.
file4=formatedFile1
file5=formatedFile2
file6=formatedFile3
recurrenceCol=3
for col in 4 5 6
do
col1=$col
col2=$((col+recurrenceCol))
echo $col1
echo $col2
id="file"$col
out=out"$ID"
f=${!id}
awk -v col1="$col1" \
-v col2="$col2" \
-v id="$f" '
BEGIN {OFS="\t"}
{
print $1,$2,$3,$(col1),$(col2),id
}
' file
# echo --- -- --- --- --- ---
done