예를 들어 내 파일은 다음과 같습니다.
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을 볼 때 명시적인 출력 외에는 출력이 없다는 것을 의미합니다.