awk를 사용하여 문자열의 두 부분 추출

awk를 사용하여 문자열의 두 부분 추출

문자열의 두 패턴을 추출하여 인쇄하고 싶습니다.

내 파일에는 수백 줄의 텍스트가 있지만 여기에는 두 줄이 있습니다. 각 줄에는 F1, F2, F4, F4, F5, F6, F7 토큰이 있고 그 뒤에는 4개의 문자가 옵니다.

F1A308F2A309 F3A310F4A311 F5A312F6A313F7A314

F1B308F2B309 F3B310F4B317 F5B312F6B313F7B315

"F2" 패턴 뒤의 4글자와 "F6" 패턴 뒤의 4글자를 추출하여 출력을 하고 싶습니다.

A309 A314

B309 B313

더 명확히 하기 위해 F2와 F4 다음의 문자만 추출하면 됩니다.

답변1

Perl을 사용하면 앵커 문자에 대해 뒤돌아보기를 사용합니다.

$ perl -lne 'print join " ", /(?<=F2|F6)(.{4})/g' file
A309 A313

B309 B313

답변2

다음 awk 스크립트는 귀하의 요구 사항에 대한 대략적인 것입니다.

{
  for(i=1;i<=NF;i++) {
    if (match($i, "F2....$") > 0) {
      printf "%s ", substr($i, RSTART + 2, 4);
    }
    if (match($i, "F6....$") > 0) {
      printf "% s", substr($i, RSTART + 2, 4);
    }
  }
  print ""
}

각 행을 반복한 다음 해당 행의 각 필드를 반복합니다. 각 요소에 대해 요소의 끝에 "F2"가 있고 끝에 4자가 있으면 해당 4자를 인쇄하고 그 뒤에 공백이 옵니다. 루프 라인을 완료한 후 캐리지 리턴 문자를 인쇄합니다.

입력에 따라 출력은 다음과 같습니다.

A309 A314

B309 B315

awk 스크립트의 업데이트된 버전에서는 해당 필드 내 어디에나 있는 요소를 처리하기 위해 간단히 $앵커를 제거하면 됩니다.

{
  for(i=1;i<=NF;i++) {
    if (match($i, "F2....") > 0) {
      printf "%s ", substr($i, RSTART + 2, 4);
    }
    if (match($i, "F6....") > 0) {
      printf "% s", substr($i, RSTART + 2, 4);
    }
  }
  print ""
}

답변3

이건 어때:

echo 'str' | egrep -o '(F2|F6)....' | egrep -o '....$' | xargs -n2

관련 정보