"txt A"에서 번호를 검색하여 csv 파일로 대체

"txt A"에서 번호를 검색하여 csv 파일로 대체

많은 방법을 시도했지만 여전히 원하는 효과를 얻을 수 없습니다. 죄송합니다. 아직 배우는 중이에요.

내가 원하는 것은 이것이다:

파일A.txt

5844
6069
6303
6309

파일B.txt

// some comment
// some  explanation
100,5,3,8,,,
500,5,44,8,,,
//2500,5,2,8,,,
2121,5,2,8,,,
5535,5,4,6069,,,
5844,1,4,5844,,,
5900,5,2,8,,,
6069,5,4,8,,,

A.txt에서 검색된 숫자를 변경하고 B.txt에서 해당 줄을 주석 처리하고 싶습니다. 때로는 검색된 숫자가 다른 열에 나타날 수 있으므로 첫 번째 열만 변경됩니다.

결과:

// some comment
// some  explanation
100,5,3,8,,,
500,5,44,8,,,
2500,5,2,8,,,
2121,5,2,8,,,
5535,5,4,6069,,,
//5844,1,4,5844,,,
5900,5,2,8,,,
//6069,5,4,8,,,

나는 그것을 시도했지만 때로는 엉망이 되어 다른 열도 변경됩니다. 그런 다음 매우 길고 수정하기 어려운 이와 같은 것을 사용했습니다.

awk -F ',' '/^5844/ && $1="5844"{$1="//5844"}1' b.txt > c.txt; cp c.txt ba.txt; rm -rf b.txt; mv ba.txt b.txt

때로는 "," 구분 기호도 제거됩니다.

도와주세요, 정말 감사합니다.

답변1

$ awk -F , 'FNR==NR { data[$1]=1; next } $1 in data { $0 = "//" $0 }; 1' 'File A.txt' 'File B.txt'
500,5,4,8,,,
5535,5,4,6069,,,
2121,5,4,8,,,
//5844,5,4,5844,,,
//6069,5,4,8,,,

File A.txt여기서 내가 하는 일은 먼저 연관 배열의 키에서 숫자를 읽는 것입니다 data. 그런 다음 각 첫 번째 필드를 테스트하여 File B.txt해당 필드가 키 필드인지 확인합니다 data. 그렇다면 //현재 줄 맨 앞에 추가합니다. 그런 다음 수정 여부에 관계없이 모든 줄을 인쇄합니다.

테스트는 명령줄의 첫 번째 파일에서 읽을 때만 FNR==NRtrue가 되며 블록은 로 끝납니다 next. 즉, 첫 번째 필드가 배열의 키인 경우 첫 번째 파일만 실행되는 동안 한 블록만 실행됩니다. 두 번째 파일의 두 번째 블록 data.

대신 최종 1트리거 출력을 사용할 수 있습니다 { print }.

위의 내용은다음에 추가 //첫 번째 파일의 번호와 일치하는 두 번째 파일의 줄로 이동합니다. 지예제거하다 //선을 따라가세요아니요일치 항목(예: 업데이트된 질문 처리):

$ cat 'File B.txt'
// some comment
// some  explanation
100,5,3,8,,,
500,5,44,8,,,
//2500,5,2,8,,,
2121,5,2,8,,,
5535,5,4,6069,,,
5844,1,4,5844,,,
5900,5,2,8,,,
6069,5,4,8,,,
$ awk -F , 'FNR==NR { data[$1]=1; next } FNR > 2 { if ($1 in data) $0 = "//" $0; else sub("^//","") }; 1' 'File A.txt' 'File B.txt'
// some comment
// some  explanation
100,5,3,8,,,
500,5,44,8,,,
2500,5,2,8,,,
2121,5,2,8,,,
5535,5,4,6069,,,
//5844,1,4,5844,,,
5900,5,2,8,,,
//6069,5,4,8,,,

이 명령은 처음 두 줄을 변경 없이 통과하기를 awk원한다고 가정합니다 (이는 테스트에서 담당하는 것입니다). 이 블록은 숫자가 키인지 테스트하고 , 그렇다면 해당 행을 주석 처리하지만, 그렇지 않은 경우 행 시작 부분에 있는 항목이 제거됩니다 .File B.txtFNR > 2FNR > 2data//sub()

FNR > 2/^\/\/ /대신 테스트 파일 상단의 주석을 사용할 수 있습니다 . 이렇게 하려면 모든 주석이 항상 //공백으로 시작되어야 합니다.

특수 변수는 지금까지 읽은 NRFNR줄 수( )와 현재 파일( )을 보유합니다.NRFNR


첫 번째 필드만 변경하면 현재 값(기본값은 공백임)을 사용하여 레코드가 재구성 $1 = "//" $1되므로 쉼표가 "사라집니다". 쉼표 문자(또는 명령줄에서 사용하는 모든 항목) 로 설정되는 를 OFS사용하여 이를 방지할 수 있습니다 .BEGIN { OFS=FS }OFS-F

관련 정보