내 의도는 코드를 가능한 한 단순하게 유지하는 것입니다. 여기에는 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 1
의 awk 'NR == 1 {print $0}'
첫 번째 줄만 인쇄하려면 head
루프 없이 사용할 수 있습니다.
head -q -n 1 A_*.CSV >Newheader.csv
awk 루프도 필요하지 않습니다. 참조아케마의 대답.