For 루프를 사용하여 여러 파일(aprilPlate.txt, mayPlate.txt, junePlate.txt, julyPlate.txt, augustPlate.txt)의 특정 열에 대한 데이터를 구문 분석하고 싶습니다.
입력 파일(aprilPlate.txt, mayPlate.txt, junePlate.txt, julyPlate.txt, augustPlate.txt)의 데이터는 다음과 같습니다.
Incl Cal Ps Name Q Con Std Status
True 255 A1 Sample 1 35.86 0
True 255 A2 Sample 2 36.06 0
True 255 A3 Sample 3 17.45 0
True 255 A4 Sample 4 17.56 0
True 255 A5 Sample 5 17.55 0
True 255 A6 Sample 6 40.00 0
True 255 A7 Sample 7 36.38 0
True 255 A8 Sample 8 27.98 0
True 255 A9 Sample 9 27.95 0
True 255 A10 Sample 10 28.19 0
True 255 A11 Sample 11 36.93 0
True 255 A12 Sample 12 37.74 0
True 255 A13 Sample 13 17.88 0
True 255 A14 Sample 14 17.82 0
True 255 A15 Sample 15 17.90 0
.
.
.
FOR 루프를 사용하여 작업을 수행할 수 있었습니다. 하지만 모든 파일에서 필요한 데이터를 얻으려면 스크립트(아래)에서 파일 이름을 수동으로 수정해야 합니다.
#!/bin/bash
# parse the data of desire columns from target file
# rename the column name
# redirect the stdoutput to a text file
for z in A B;
do for i in 3 4 5 13 14 15;
do grep $z$i aprilPlate.txt |
awk -F "\t" '{print $3 "\t" $5}' |
sed -e 's/A[3-5]/st_SWC/g;s/A[1][0-9]/st_SWD/g;s/B[3-5]/st_TZC/g;s/B[1][0-9]/st_TZD/g;' >> stone.txt;
done;
done
for z in E F;
do for i in 8 9 10 18 19 20;
do grep $z$i aprilPlate.txt |
awk -F "\t" '{print $3 "\t" $5}' |
sed -e 's/E[8-9]\|E[1][0]/su_SWC/g;s/E[1][0-9]\|E[2][0]/su_SWD/g;s/F[8-9]\|F[1][0]/su_TZC/g;s/F[1][0-9]\|F[2][0]/su_TZD/g;' >> suy.txt;
done;
done
paste -d'\t' stone.txt suy.txt >> aprilPlate.data.txt
- 죄송합니다. 이전 코딩에 실수가 있었습니다. 수정이 완료되었습니다.
데이터 파일을 구문 분석한 결과는 다음과 같아야 합니다.
st_SWC 17.45 su_SWC 28.85
st_SWC 17.56 su_SWC 28.79
st_SWC 17.55 su_SWC 28.82
st_SWD 17.88 su_SWD 29.24
st_SWD 17.82 su_SWD 29.18
st_SWD 17.90 su_SWD 29.23
st_TZC 18.06 su_TZC 25.99
st_TZC 18.09 su_TZC 25.98
st_TZC 18.13 su_TZC 26.02
st_TZD 17.75 su_TZD 25.00
st_TZD 17.70 su_TZD 25.01
st_TZD 17.69 su_TZD 24.98
묻고 싶습니다. 파일을 스크립트의 세 번째 변수로 사용할 수 있습니까? 다른 솔루션을 환영합니다.
답변1
이와 같은 것이 당신에게 도움이 될 것입니다
for file in aprilPlate.txt mayPlate.txt junePlate.txt julyPlate.txt augustPlate.txt;
do
for z in A B;
do for i in 3 4 5 13 14 15;
do grep $z$i $file |
awk -F "\t" '{print $3 "\t" $5}' |
sed -e 's/A[3-5]/SWC/g;s/A[1][0-9]/SWD/g;s/B[3-5]/TZC/g;s/B[1][0-9]/TZD/g;' >> stone.txt;
done;
done
<snip>
done
답변2
입력 또는 출력 예제가 없기 때문에 정확히 무엇을 하려는지 확실하지 않지만 다음은 작동할 것입니다.
#!/bin/bash
awksrc='BEGIN{FS=OFS="\t"}
{ gsub(/A[345]|E[89]|E10/, "SWC");
gsub(/A1[0-9]|E1[1-9]|E20/, "SWD");
gsub(/B[345]|F[89]|F10/, "TZC");
gsub(/B1[0-9]|F1[1-9]|F20/, "TZD");
}
/SW[CD]{print $3, $5 >"stone.txt"}
/TZ[CD]{print $3, $5 >"suy.txt"}'
for file in aprilPlate.txt mayPlate.txt junePlate.txt julyPlate.txt ...
do
awk "$awkscr" $file >/dev/null
paste -d'\t' stone.txt suy.txt >> ${file%.txt}.data.txt
done
${file%.txt}
확장자를 추가하지 않고 기본 이름을 가져옵니다 .data.txt
.
이렇게 하면 셸 루프 수가 하나로 줄어들어 각 파일을 한 번 처리합니다. awk
파일이 작성되므로 스크립트의 출력은 필요하지 않습니다.
다시 말하지만, 샘플 입력이 없으면 이것이 귀하의 목적에 적합한지 여부를 말하기가 어렵습니다.