나는 이것을 여러 가지 방법으로 시도했지만 여전히 내가 원하는 것을 달성할 수 없습니다. 죄송해요 아직 배우는 중이에요.
내가 원하는 것은 이렇습니다.
파일 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