
예를 들어 내 파일은 다음과 같습니다.
59 6 18 2014 169 7 14 2 7671912 7849744 201 4
60 6 19 2014 170 5 49 2 7671912 7849744 201 5
61 6 20 2014 171 6 8 2 7671912 7849744 201 6
62 6 23 2014 174 5 3 2 7671912 7849744 201 7
63 6 23 2014 174 7 17 2 7671912 7849744 201 8
64 6 24 2014 175 16 13 2 7671912 7849744 201 9
65 6 25 2014 176 8 20 2 7671912 7849744 201 10
10
1 1 49 6 16 2014 7 39 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 2 49 6 17 2014 13 15 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 3 49 6 18 2014 1 38 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 4 49 6 18 2014 7 14 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
1 5 49 6 19 2014 5 49 201 1 0 1043 <au_launchpad_back.gif> 201 gif <SIZE> 871
단일 토큰 항목 "10"의 이전 줄을 인쇄해야 합니다.
65 6 25 2014 176 8 20 2 7671912 7849744 201 10
어떻게 해야 하나요?
답변1
당신이 사용할 수있는awk
:
awk 'NF == 1 { print LAST } { LAST=$0 }' < datafile
이렇게 하면 파일의 모든 행( LAST=$0
)이 진행되는 대로 저장되고, 행에 레코드가 하나만 있는 경우( NF == 1
-는 NF
대략적으로 말하면 해당 행의 토큰 수) 저장된 이전 행을 인쇄합니다.
답변2
토큰이 한 번만 발생하는 경우 GNU grep
및 다음을 사용하여 이를 수행할 수 있습니다 head
.
grep -x -B 1 10 file | head -n 1
일치하는 줄과 그 앞의 줄을 인쇄하도록 지시 -B 1
합니다 . 옵션 grep
을 사용하면 실제로 행 과 일치합니다 (-x
grep 10
x
10
포함하는 10
). 마지막으로 head -n 1
결과 줄 중 첫 번째 줄만 인쇄됩니다.
답변3
sed
당신이 사용할 수있는 sed
:
sed -e '/^10$/{x;p;}' -e 'x;d' < datafile
설명:
주소는 /^10$/
10을 포함하는 라인과 일치합니다. 일치하면 다음과 같은 일련의 명령이 실행됩니다. 이 명령은 홀드 공간을 패턴 공간과 {x;p;}
교환( )한 다음 패턴 공간을 인쇄( )합니다.x
p
보류 공간에는 스크립트의 나머지 부분으로 인해 이전 줄이 포함됩니다. 파일의 각 라인에 대해 x
홀드 공간을 패턴 공간으로 교환( )한 다음 d
패턴 공간에 있는 모든 것을 삭제( )합니다.
10번째 줄이 보일 때만 일치하도록 하는 주소 접두사가 있는 첫 번째 명령과 달리 이러한 명령에는 접두사가 없으므로 파일의 모든 줄에서 일치합니다. 최종 결과는 보이는 마지막 줄을 계속 유지 공간에 넣는 것이며 패턴 공간을 삭제한다는 것은 10을 볼 때 명시적인 출력 외에는 출력이 없음을 의미합니다.