탭이 분리되어 있습니다 file
.
qrs John tuv
abcd Sam efgh
ijk Sam lmnp
abcd Sam efgh
ijk Sam lmnp
qrs John tuv
두 번째 필드가 두 번째 필드의 이전 행 값과 일치하지 않는 행을 인쇄하고 두 번째 필드가 다음 행의 값과 일치하지 않는 행을 인쇄하려고 합니다.
나는 다음과 같은 변형을 시도했지만 그 중 어느 것도 예상대로 작동하지 않습니다.
awk -F"\t" '{
name=$3;
line=$0;
getline;
newname=$3;
newline=$0;
getline;
nextname=$3;
nextline=$0;
if (newname != name || name != nextname)print line"\n"nextline }' input.txt
답변1
너에게서논평, 다음과 같은 로그인 및 로그아웃 날짜가 포함된 로그 파일이라고 가정합니다.
date1 John logout
date2 Sam login
date3 Sam work1
date4 Sam work2
date5 Sam logout
date6 John login
사용 awk
:
awk 'NR!=1&&$2!=f{print p"\n"$0} {f=$2; p=$0}' file
어디:
NR!=1
awk
첫 번째 줄을 제외한 모든 줄을 처리할 때 True(NR
현재 파일의 줄 번호 포함)$2!=f
두 번째 필드를$2
변수 값f
(f
나중에 설정) 과 비교합니다.- 두 구성이 모두 적용되는 경우 (나중에 설정될 이전 줄), 개행 및
awk
현재 줄의 값을 인쇄합니다.p
\n
$0
- 두 구성이 모두 적용되는 경우 (나중에 설정될 이전 줄), 개행 및
- 이제 각 행이 처리됩니다. 변수는
f
두 번째 필드로 설정되고$2
변수는p
현재 행으로 설정됩니다$0
. 둘 다 다음 반복(다음 행이 처리될 때)에서 사용됩니다.
이제 두 번째 필드(예: 로그아웃, 로그인 날짜 및 이름)의 첫 번째와 마지막 항목을 인쇄합니다. 그러면 출력은 다음과 같습니다.
date1 John logout
date2 Sam login
date5 Sam logout
date6 John login
답변2
$2
값으로 변수를 지정하여 다음 명령을 시도해 보십시오.
awk -F"\t" 'NR != 1 { if ( x != $2 ) print $0; } { x = $2 }' file