이 문제를 해결하는 데 도움을 주셨으면 좋겠습니다.
열의 처음 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