루프를 사용하여 파일 이름 정렬을 수행하는 방법

루프를 사용하여 파일 이름 정렬을 수행하는 방법

내 의도는 코드를 가능한 한 단순하게 유지하는 것입니다. 여기에는 5개의 파일이 있습니다.

A_1.CSV, A_2.CSV, A_3.CSV, A_4.CSV, A_5.CSV

다음 코드는 CSV 파일의 첫 번째 행을 검색합니다.

코드: head.sh(파일 이름)

awk -F, 'NR==1 {print $0}' A_1.CSV > Header.csv
awk -F, 'NR==1 {print $0}' A_2.CSV >> Header.csv
awk -F, 'NR==1 {print $0}' A_3.CSV >> Header.csv
awk -F, 'NR==1 {print $0}' A_4.CSV >> Header.csv
awk -F, 'NR==1 {print $0}' A_5.CSV >> Header.csv

질문:

위 코드에서는 파일 이름만 A_1에서 A_2로 변경되는 식으로 진행됩니다. 루프를 사용하여 코드를 간단하게 만드는 방법

예:

 for (i=1;i<=5;i++)
      {
       A_[i].CSV >> Header.csv
      }

쉘 스크립트를 사용하여 이 논리를 구현하는 방법을 모르겠습니다.

업데이트된 코드:

디렉토리에 있는 파일:/home/thiyagu/Desktop/

for file in 'A_*.CSV'
do
awk -F, 'NR==1 {print $0}' $file >> Newheader.csv
done

답변1

무엇에 대해

 awk 'FNR==1' A_*.csv > Header.csv

어디

  • FNR파일번호 기록인가요?
  • 기본 동작은 while 라인을 인쇄하는 것입니다.
  • -F,개별 필드에 관심이 없어서 포기했습니다 . (단, 다른 할 일이 있으면 다시 추가할 수 있습니다.)

답변2

다음과 같이 작동합니다.

for file in `ls A_*.csv`
do
awk -F, 'NR==1 {print $0}' $file >> Header.csv
done

이것은 기본적인 쉘 스크립트 루프입니다. 검색하면 온라인에서 이러한 튜토리얼을 찾을 수 있습니다.

답변3

작은따옴표는 확장을 방지합니다. 작은따옴표로 묶인 문자열의 모든 문자는 문자 그대로 해석됩니다( '문자열 자체를 끝내는 문자 제외). 따라서 와일드카드 역할을 하려면 *따옴표 밖에 두십시오. (큰따옴표는 *와일드카드 문자 역할도 방지합니다.)

for file in A_*.CSV …

업데이트된 코드의 나머지 부분은 괜찮을 수 있지만변수 대체 주위에 큰따옴표 추가, 그렇지 않으면 조만간 당신을 물릴 것입니다.

루프 외부로 리디렉션할 수 있습니다. 이것은 약간 더 빠릅니다.

for file in A_*.CSV
do
  awk -F, 'NR==1 {print $0}' "$file"
done >> Newheader.csv

이 코드 조각은 에 추가됩니다 Newheader.csv. 파일이 이미 존재하는 경우(원본 코드와 같이) 덮어쓰려면 >>>.

여러 파일의 첫 번째 줄만 인쇄하려는 경우 스크립트를 단순화하는 방법이 있습니다. 첫 번째 줄만 인쇄하므로 -F,사용되지 않습니다. 또한 Linux에서는(모든 Unix 변형에서는 해당되지 않음) 여러 파일 head -n 1awk 'NR == 1 {print $0}'첫 번째 줄만 인쇄하려면 head루프 없이 사용할 수 있습니다.

head -q -n 1 A_*.CSV >Newheader.csv

awk 루프도 필요하지 않습니다. 참조아케마의 대답.

관련 정보