'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==NR는 명령줄의 첫 번째 파일에서 읽는 동안에만 true가 되며 블록은 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명령은 through의 처음 두 줄을 변경하지 않고 전달한다고 가정합니다 File B.txt(이것은 FNR > 2테스트에서 처리하는 것입니다). 블록 FNR > 2은 숫자가 키 입력 data인지 여부를 테스트하고, 그렇다면 해당 줄을 주석 처리하고, 그렇지 않으면 를 //사용하여 줄 시작 부분에 있는 모든 항목을 제거합니다 sub().

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

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


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

관련 정보