쉘 스크립트를 사용하여 파일을 처리해야 합니다. 파일에는 데이터와 파일 처리 방법에 대한 일부 정보가 포함되어 있습니다. 파일의 형식은 다음과 같습니다.
- 이메일 주소
- 시스템 영역
- 품목 번호
- 품목 번호
- 품목 번호
- 품목 번호
- 등...
email_address는 사용자에게 파일 제출이 완료되었음을 알리는 데 필요하며, system_area는 로딩 프로세스가 파일을 로드해야 하는 위치를 나타냅니다. 그래서 이 두 값을 스크립트에서 사용할 변수에 넣어두었습니다. 저는 현재 3개의 sed 명령을 사용하여 정보를 가져온 다음 해당 줄을 삭제하고 있습니다.
var1=$(sed -n '1p' infile)
var2=$(sed -n '2p' infile)
sed -i '1,2d' infile
위의 코드는 작동하지만 "투박"하고 비효율적이라고 생각됩니다. 동일한 목표를 보다 우아하고 효율적으로 달성하는 방법을 아는 사람이 있습니까?
답변1
귀하의 코드는 괜찮습니다. 아마도 빠른 수정으로 이 작업을 수행할 것입니다. 인쇄 후 즉시 sed를 종료하는 것이 더 효율적입니다. sed -n '1{p;q}'
아무 이유 없이 전체 파일을 읽지 마십시오.
이제 가장 어색한 부분은 처음 두 줄을 얻기 위해 파일을 두 번 읽는 것입니다. 간단히 쉘 내장 명령을 사용할 수 있습니다:
{ read -r var1; read -r var2; } < infile
그런 다음 유지하거나 sed -i '1,2d'
간단히 사용하십시오 tail -n +3 > outfile; mv outfile infile
.
한 번에 이 작업을 수행하는 궁극적인 방법은 두 개의 변수를 읽은 read
다음 나머지를 캡처하는 것입니다.
{ read -r var1; read -r var2; cat; } < infile > outfile
출력을 다른 파일에 저장했습니다(그런 다음 다시 복사할 수 있음). 이는 내부 수정을 사용하는 것만큼 "우아"하지는 않지만 sed
더 안전하고 동일한 양의 코드를 작성합니다. 마지막 버전에서는 파일을 세 번 읽지 않고 한 번만 읽습니다.
답변2
제 생각에는 var1
과 var2
같은 가치를 얻을 것입니다.
나는 사용할 것이다
var1=$(awk 'NR==1' infile)
var2=$(awk 'NR==2' infile)
sed -i '1,2d' infile
어디
NR
레코드 개수, 즉 줄 번호를 나타내는 awk 변수입니다.NR==1
행 1을 선택하세요.- 기본 awk 작업은 전체 줄을 인쇄하는 것입니다.