많은 방법을 시도했지만 여전히 원하는 효과를 얻을 수 없습니다. 죄송합니다. 아직 배우는 중이에요.
내가 원하는 것은 이것이다:
파일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
원한다고 가정합니다 (이는 테스트에서 담당하는 것입니다). 이 블록은 숫자가 키인지 테스트하고 , 그렇다면 해당 행을 주석 처리하지만, 그렇지 않은 경우 행 시작 부분에 있는 항목이 제거됩니다 .File B.txt
FNR > 2
FNR > 2
data
//
sub()
FNR > 2
/^\/\/ /
대신 테스트 파일 상단의 주석을 사용할 수 있습니다 . 이렇게 하려면 모든 주석이 항상 //
공백으로 시작되어야 합니다.
특수 변수는 지금까지 읽은 NR
총 FNR
줄 수( )와 현재 파일( )을 보유합니다.NR
FNR
첫 번째 필드만 변경하면 현재 값(기본값은 공백임)을 사용하여 레코드가 재구성 $1 = "//" $1
되므로 쉼표가 "사라집니다". 쉼표 문자(또는 명령줄에서 사용하는 모든 항목) 로 설정되는 를 OFS
사용하여 이를 방지할 수 있습니다 .BEGIN { OFS=FS }
OFS
-F