열의 처음 5개 요소를 나머지 요소와 비교

열의 처음 5개 요소를 나머지 요소와 비교

이 문제를 해결하는 데 도움을 주셨으면 좋겠습니다.

열의 처음 5개 요소를 나머지 요소(열별)와 비교하고 싶습니다.

  • 처음 5개 요소가 동일한 경우 --> 계속
  • 처음 5개 요소가 나머지 요소와 동일하고 다른 경우 다음 열을 인쇄하세요.

테이블에는 TABS로 구분된 100개 이상의 열과 12개 행이 있습니다.

입력 예:

존 로라 벤 크리스 댄 톰
존 로라 벤 레인 댄 톰
존 로라 벤 크리스 댄 톰
존 로라 벤 크리스 댄 톰
존 로라 벤 크리스 댄 톰
데이브 로라 테일러 크리스 도나 살라
데이브 로라 하비 크리스 댄 살라

원하는 출력:

존 벤 톰
존 벤 톰
존 벤 톰
존 벤 톰
존 벤 톰
데이브 테일러 사라
데이브 하비 사라

여러분의 모든 생각과 의견에 진심으로 감사드립니다.

감사해요

답변1

일반적으로 행(행)에서 작업하는 것이 가장 좋습니다. awk한 번에 한 행씩 작업하는 것과 같은 도구입니다. 열을 행으로 변환(예: 전치)하려면 다음을 사용하세요.암소 비슷한 일종의 영양datamash. 그런 다음 각 라인을 awk개별적으로 테스트하여 적절하게 인쇄하거나 인쇄하지 않을 수 있습니다. 마지막으로 datamash다시 사용하여 결과를 원래 형식으로 바꿉니다.

<data datamash transpose | awk '{
    for (i=2; i<=5; i++) if ($1!=$i) next
    for (i=6; i<=NF; i++) if ($1==$i) next
    print
}' | datamash transpose

논리적인 설명은 다음과 같습니다.

  • 2..5의 필드가 필드 번호 1과 다른 경우 첫 번째 필드는 for줄을 건너뛰고 다시 시작합니다. 5개 필드가 모두 동일해야 프로그램이 다음 코드 줄을 계속 실행할 수 있습니다.
  • for다음 필드 중 첫 번째 필드와 동일한 필드가 있으면 두 번째 필드는 줄을 건너뛰고 처음부터 다시 시작합니다.
  • 프로그램이 이 두 for기준을 모두 초과하는 경우 귀하의 기준과 모순되는 조건이 전혀 발견되지 않았음을 의미합니다. 그래야만 전체 라인을 인쇄할 수 있습니다.

노트:

  • 원래 질문(전치할 필요 없음)에서는 적어도 하나의 열이 기준과 모순되지 않는 경우에만 다음 줄을 읽으면 됩니다. 데이터에 따라 처음 몇 행을 읽은 후 모든 열이 불일치로 선언될 수 있습니다. 이 경우 알고리즘은 빠르게 종료되고 아무것도 인쇄하지 않을 수 있습니다. 하지만 datamash transpose데이터에 관계없이 전체 파일(또는 스트림)을 읽고 처리해야 합니다. 이 경우 내 솔루션은 이상적이지 않습니다.
  • 작동 하지 않는 경우 해결책이 datamash있습니다awk여기.

답변2

열을 행으로 바꾼 다음 정규식을 실행하여 인쇄하려는 행을 확인해야 합니다. 처음 5개 요소가 동일한 경우 아래에서 동일한 요소가 다시 표시되어서는 안 됩니다. 마지막으로 결과를 다시 전치하여 원하는 출력을 얻습니다.

HTH.

rs -T  inp |
perl -lane 'print if "@F" =~ /^(\S+)(?: \1){4}(?: (?:(?!\1(?=(?: |$))).)+)+$/' |
rs -T

산출:

Jhon    Ben     Tom
Jhon    Ben     Tom
Jhon    Ben     Tom
Jhon    Ben     Tom
Jhon    Ben     Tom
Dave    Taylor  Sara
Dave    Harvey  Sara

관련 정보