필드 awk로 파일에서 첫 번째와 마지막 행을 제거하는 가장 쉬운 방법은 무엇입니까?




리눅스 특정 열 출력 (3)

나는 awk / gawk를 배우고있다. 그래서 최근에 나는 더 많은 연습 기회를 얻기 위해 모든 문제를 해결하려고 노력합니다.

나의 동료는 어제 질문을했다,

"파일에서 첫 번째 줄과 마지막 줄을 제거하는 방법"

. sed '1d;$d' file 이 작동한다는 것을 알고 있습니다. 또한 head/tail 은 성능이 좋지 않더라도 작동합니다. 나는 그에게 말했고, 그는 행복했다.

나중에, 나는 awk one-liner를 썼다 : 지금까지 나는 무엇을 얻었 는가?

awk 'NR>1{a[++k]=$0}END{for(i=1;i<k;i++)print a[i]}'

이렇게하면 전체 파일을 배열로 저장하여 마지막 행을 건너 뜁니다. 그 일을 더 쉽게 (또는 더 나은) 방법이 있어야한다고 생각합니다.

(더 쉽거나 빠르거나 더 좋은 방법이 없다면 나는 그 질문을 제거 할 것이다)

고맙습니다.


다른 방법이 있지만 gawk 함수 길이가 필요합니다.

awk '{firstline=2; cuttail=1; l[NR]=$0} END {for (i=firstline; i<=length(l)-cuttail; i++) print l[i]}'

다른 해결책을 제안하겠습니다. Top과 Bottom 라인에 커스텀 N이 필요한 경우 tailhead 커맨드를 사용할 수 있습니다 :

awk '{print $1}'  | head -n -1 | tail -n+2

head -n -1 - 마지막 행을 제거합니다.

tail -n + 2 - 두 번째 줄에서 출력 시작 (1 줄 제거)

다음 명령은 상단과 하단에서 3 줄을 제거합니다 :

awk '{print $1}'  | head -n -3 | tail -n +4

사실 awk도 필요 없습니다.

more | head -n -1 | tail -n +2

또는

cat | head -n -1 | tail -n +2

코멘트를위한 Igor Fobia 에 감사드립니다!


이것은 트릭을 수행합니다 :

awk 'NR>2 {print last} {last=$0}'

awk 는 NR> 2 일 때만 작업 print last 실행합니다 (즉, 모든 행에서 처음 2 행). 모든 라인에서 변수를 last 으로 현재 라인 last 설정합니다. 그래서 awk 가 세 번째 줄을 읽을 때, last 줄에 저장된 줄 2를 인쇄합니다. 마지막 줄 (줄 n)을 읽으면 줄 n-1의 내용을 인쇄합니다. 그물 효과는 선 2부터 n-1까지가 인쇄된다는 것입니다.