awk는 배열 인덱스를 인식할 수 없습니다

awk는 배열 인덱스를 인식할 수 없습니다

탭으로 구분된 두 개의 파일이 있는데 각각 두 개의 열이 있습니다. 두 파일 중 1열에 요소가 겹치는 파일을 만들고 싶습니다. 이를 위해 먼저 파일 1을 배열에 넣은 다음 배열을 스캔하여 파일 2에 겹치는 부분이 있는지 확인합니다. 그러나 어떻게 든 배열의 인덱스가 인식되지 않습니다. 문제에 대한 자세한 설명은 아래에 제공됩니다.

파일의 처음 3줄은 다음과 같습니다.

파일 1:

90001   raw acceleration data
2634    Heavy DIY
1011    Light DIY

파일 2:

2634    218263
25680   44313
25681   44313

두 파일의 열 1에 중복이 있음을 표시하려면 다음을 수행하십시오.

user@cluster:~> grep 90001 file2
90001   103662
user@cluster:~> grep 2634 file2
2634    218263

파일 3을 만들기 위해 먼저 이것을 시도했는데 결과적으로 빈 파일이 생겼습니다.

awk 'BEGIN {FS = "\t"; OFS= "\t"} 
 NR==FNR {a[$1]=$2; next}
 { if($1 in a) print $1, a[$1]}' file1 file2 > file3

else다음 코드는 해당 행을 추가하면 실제로 file2를 file3에 인쇄하기 때문에 배열의 인덱스가 인식되지 않는다는 문제가 있음을 확인합니다 .

awk 'BEGIN {FS = "\t"; OFS= "\t"} 
 NR==FNR {a[$1]=$2; next}
 {if($1 in a) 
      print $1, a[$1]
   else 
      print $1, $2}' file1 file2 > file3

혼란스러워요. 이 문제의 원인과 해결 방법을 알고 싶습니다. 미리 감사드립니다.

답변1

~에서귀하의 의견:

이것은 출력의 첫 번째 줄입니다.90001\r\traw acceleration data$

첫 번째 필드는 입력의 필드에 맞게 변경하지 마십시오. 또는 스크립트 시작 부분에 추가하거나 유사한 내용 을 90001\r제거 하여 제거하십시오.90001FS = "\t"FS = "\r?\t"\r{ sub(/\r/,"") }

바라보다내 도구 출력이 자체적으로 덮어쓰이는 이유와 해결 방법\r입력 파일의 s(캐리지 리턴)에 대한 추가 정보. 일반적으로 중간이 아닌 줄 끝에 있습니다. 현재 문제는 이전 단계에서 필드 순서를 변경하거나 파일을 제거하는 대신 이전 버전의 파일에서 각 줄 끝에 문자열을 추가한 결과일 수 있습니다. 끄다 \r.

그런데 다음과 같이 작성해 보세요.

if($1 in a) 
      print $1, a[$1]
   else 
      print $1, $2

로서삼항 표현:

print $1, ($1 in a ? a[$1] : $2)

많은 코드 작성과 중복을 피하기 위해 print $1,. 또한 이것을 변경하는 것을 고려하십시오:

FS = "\t"; OFS= "\t"

이와 관련하여:

FS=OFS="\t"

같은 이유로 - 중복이 적고 코드가 더 깔끔합니다.

관련 정보