Bash: 2개의 파일을 사용하여 첫 번째 파일의 특정 이름이 두 번째 파일에도 나타나는지 확인하는 방법

Bash: 2개의 파일을 사용하여 첫 번째 파일의 특정 이름이 두 번째 파일에도 나타나는지 확인하는 방법

음, 문제는 그것보다 조금 더 복잡해요

2개의 파일이 있습니다.파일 1그리고파일 2, 각각 다음 데이터가 포함됩니다.

name of the game, hours spent playing it, last 7 days

파일 1:

game1 100 20
game3 40   5

파일 2:

game1 90  25
game4 40   2

표적:

  • 두 파일 모두에 게임이 있으면 게임을 플레이하는 데 소요된 시간을 뺍니다.파일 1 - 파일 2

  • 게임만 있는 경우파일 1, 표시하지만 원본으로(파일 1 - 0)

  • 게임만 있는 경우파일 2, 표시하지만 원래의 부정으로 표시(0 - 파일 2)

어떻게 해야 합니까 bash?

답변1

파일이 정렬되어 있다고 가정하면 커프 답변에서 벗어납니다.

awk '{$2= -$2; $3= -$3} 1' file2 |
  join -a1 -a2 file1 - |
  awk 'NF > 3 {$2+=$4; $3+=$5; NF=3} 1'

입력의 출력을 제공합니다.

game1 10 -5
game3 40 5
game4 -40 -2

(파일이 정렬되지 않은 경우 정렬하고 정렬된 상태를 유지하세요. 이렇게 하면 작업이 더 쉬워집니다.)


이것은 단지POSIX의 특징join그리고Awk의 POSIX 기능, 거의 모든 곳에서 작동합니다.


$2awk에는 두 번째 필드에 대한 참조가 있습니다. $3세 번째 필드(처리 중인 파일의 각 줄)에 대한 참조입니다. 1중괄호 바깥쪽에 나타나는 것은 {...}단순히 "true"를 의미하므로 해당 줄을 인쇄하는 기본 작업이 수행됩니다.

본질적으로 첫 번째 Awk 명령은 숫자를 file2음수로 바꿉니다.

join명령은 file1표준 입력(Awk에서 받은 내용)에 제공된 텍스트에 연결됩니다. 명령에서 다음은 -(다른 파일 이름이 아닌) "표준 입력 사용"을 의미합니다. 옵션 및 는 첫 번째 또는 두 번째 파일에서 페어링할 수 없는 줄이 있는 그대로 출력됨을 의미합니다.file1join-a1-a2

마지막 Awk 명령은 쌍을 이루는 라인을 취합니다.질소수량에프fields가 3( )보다 크고 NF > 3네 번째 필드를 두 번째 필드에 추가하고 다섯 번째 필드를 세 번째 필드에 추가한 다음 네 번째 및 다섯 번째 필드를 자릅니다.

마찬가지로, 마지막 1외부 중괄호는 Awk의 기본 동작인 "print"를 실행하는 데 사용됩니다.

(바라보다이 튜토리얼자세히 알아보고 Awk를 제대로 배우세요. )


여기서는 많은 일이 일어나고 있습니다. 다음 섹션을 추가하기 전에 이 명령의 각 섹션을 실행하는 것이 좋습니다. 첫 번째:

awk '{$2= -$2; $3= -$3} 1' file2

그리고 이것을 연구하고 이해하십시오. 그 다음에:

awk '{$2= -$2; $3= -$3} 1' file2 |
  join -a1 -a2 file1 -

그리고 이것을 연구하고 이해하십시오. ( -a1및 플래그 를 생략 -a2하거나 그 중 하나만 생략해 보세요.)

그런 다음 전체 명령을 사용하십시오.

awk '{$2= -$2; $3= -$3} 1' file2 |
  join -a1 -a2 file1 - |
  awk 'NF > 3 {$2+=$4; $3+=$5; NF=3} 1'

더 의미가 있는지 살펴보세요.

답변2

우아하지 않아요 bash,,,join암소 비슷한 일종의 영양 sed변형:

join -a1 -a2 -o 0 1.2,2.2,1.3,2.3 file1 <(sed 's/ \([0-9]*\)/ -\1/g' file2) | \
sed 's/ -/-/g;s/[0-9]*-[0-9]*/$((&))/g;s/.*/echo &/eg'

산출:

game1 10 -5
game3 40 5
game4 -40 -2

관련 정보