탭으로 구분된 두 개의 파일이 있는데 각각 두 개의 열이 있습니다. 두 파일 중 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
제거 하여 제거하십시오.90001
FS = "\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"
같은 이유로 - 중복이 적고 코드가 더 깔끔합니다.