BASH for 루프에서 세 번째 변수를 사용하는 방법은 무엇입니까?

BASH for 루프에서 세 번째 변수를 사용하는 방법은 무엇입니까?

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파일이 작성되므로 스크립트의 출력은 필요하지 않습니다.

다시 말하지만, 샘플 입력이 없으면 이것이 귀하의 목적에 적합한지 여부를 말하기가 어렵습니다.

관련 정보