#n개의 레코드(행)가 포함된 큰 다중 열 파일이 있습니다. awk
마지막 레코드나 특정 레코드 번호에만 명령을 적용하려면 어떻게 해야 합니까 ?IGNR==4) 또는 행 범위(NR==[2-5])?
다음 파일의 예를 들면 다음과 같습니다.
echo filename
30.5,2010/06/01,2016/08/29,2281.00,0006.25,0074.94
41.6,2008/03/05,2012/03/05,1461.00,0004.00,0048.00
39.6,2008/03/05,2012/09/10,1649.96,0004.52,0054.21
41.0,2008/03/05,2013/09/16,2020.96,0005.53,0066.40
42.2,2008/03/05,2014/03/18,2203.96,0006.03,0072.41
41.1,2008/03/05,2014/09/16,2385.96,0006.53,0078.39
43.1,2008/05/08,2014/09/16,/2322.00,/0006.36,/0076.29
날짜를 제외한 모든 필드를 제거하기 위해 다음 awk 스크립트를 적용했습니다 /
.
nawk -F, -v OFS=, '{split($4,a,"/"); $4=sprintf("%06.2f", a[2]);split ($5,b,"/");$5=sprintf("%06.2f", b[2]);split($6,c,"/");$6=sprintf("%06.2f", c[2]); print $0}' filename
마지막 행에는 적합하지만 그렇지 않은 다른 행에는 부정적인 영향을 미칩니다 /
. 다음 출력:
output
30.5,2010/06/01,2016/08/29,000.00,000.00,000.00
41.6,2008/03/05,2012/03/05,000.00,000.00,000.00
39.6,2008/03/05,2012/09/10,000.00,000.00,000.00
41.0,2008/03/05,2013/09/16,000.00,000.00,000.00
42.2,2008/03/05,2014/03/18,000.00,000.00,000.00
41.1,2008/03/05,2014/09/16,000.00,000.00,000.00
43.1,2008/05/08,2014/09/16,2322.00,006.36,076.29
however, the expected correct output should be :
30.5,2010/06/01,2016/08/29,2281.00,0006.25,0074.94
41.6,2008/03/05,2012/03/05,1461.00,0004.00,0048.00
39.6,2008/03/05,2012/09/10,1649.96,0004.52,0054.21
41.0,2008/03/05,2013/09/16,2020.96,0005.53,0066.40
42.2,2008/03/05,2014/03/18,2203.96,0006.03,0072.41
41.1,2008/03/05,2014/09/16,2385.96,0006.53,0078.39
43.1,2008/05/08,2014/09/16,2322.00,0006.36,0076.29
그렇다면 마지막 줄이나 특정 줄 번호에만 적용하도록 awk에 어떻게 지시합니까?
답변1
awk가 파일을 처리할 때 변수NR
처리된 총 레코드 수를 나타냅니다. 그래서 당신은무늬예를 들어
(NR == 5)
당신 전에행동
{split($4,a,"/");...
예를 들어,
(NR == 5){split($4,a,"/");...
공정 라인 5.
네가 처리하고 싶다면마지막행만 해당 행을 기본 작업으로 저장할 수 있습니다.
{ save = $0; }
해당 섹션에서 해당 행을 처리합니다 END
. 하지만 거기에서 필드 분할을 수행해야 합니다( $0
더 이상 적용할 수 없음).
END {split(whatever,a,"/");...
범위의 경우 더 복잡한 표현식을 사용할 수 있습니다.
( NR >= 2 && NR <= 5 )
2~5행을 선택합니다.
추가 자료:
- awk의 표현(POSIX)