awk를 사용하여 필드의 처음과 마지막 항목을 인쇄합니다.

awk를 사용하여 필드의 처음과 마지막 항목을 인쇄합니다.

탭이 분리되어 있습니다 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!=1awk첫 번째 줄을 제외한 모든 줄을 처리할 때 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

관련 정보