아래에 예를 들어볼게요

아래에 예를 들어볼게요

Unix와 Sed 초보자가 여기에 있습니다!

요구사항이 있어 접미사를 추가해야 합니다.",포기하다"보고서의 행에 일치하는 문자열이 포함되어 있는 경우. 일치하는 문자열이 다른 파일의 일부입니다."포기.txt". 나는 또한 주요 보고서의 사본에 대해 이러한 작업을 수행해 보았습니다.

아래에 예를 들어볼게요

보고서는 다음과 같습니다.

i love apple_tart as a desert
banana is full of potassium and iron
there are so many helath benefits of apple eating 
the king of fruit is mango 
there are apple_pie of many variety

이것이 방법이다포기하다.txt좋다:

apple_pie
banana

이것은 동일한 파일에서 내가 원하는 예상 출력입니다.

i love apple_tart as a desert
banana is full of potassium and iron,waive
there are so many helath benefits of apple eating 
the king of fruit is mango 
there are apple_pie of many variety,waive

내가 시도한 스크립트는 다음과 같습니다.잘못된 변수 이름 실수

#!/bin/csh -f
if (-r fruits_bkup.txt) then
  rm fruits_bkup.txt
endif

yes|cp fruits.txt fruits_bkup.txt
foreach word ("`cat waiver.txt`")
  sed -i "/${word}/s/$/ ,waived/" fruits_bkup.txt 
end  

sed 명령에서 큰따옴표를 작은따옴표로 바꾸면 보고에 아무 변화도 없습니다.

감사해요!

나는 기대했다:

i love apple_tart as a desert
banana is full of potassium and iron,waive
there are so many helath benefits of apple eating 
the king of fruit is mango 
there are apple_pie of many variety,waive

얻다: 잘못된 변수 이름 실수

답변1

쉘 문제를 피하기 위해 단일 명령으로 이 문제를 해결할 수 있습니다( csh원하는 경우 awk스크립트에 입력 ). csh또한 이를 통해 입력 파일에 필요한 패스 수를 줄일 수 있습니다(패스는 하나만 필요함).

awk 'NR==FNR { query[++n] = $0; next } { for (i in query) if ($0 ~ query[i]) { $0 = $0 ",waive"; break } };1' waive.txt report.txt

이 명령은 먼저 첫 번째 파일의 행을 waive.txt연관 배열로 읽어 들입니다 query. 두 번째 파일에 도달하면 report.txt의 패턴을 반복 query하고 현재 줄에 대해 각 패턴을 테스트합니다. 일치하는 항목이 있으면 ,waive줄 끝에 추가하고 루프를 종료합니다.

마지막으로 후행은 1(수정될 수 있는) 줄이 출력되도록 합니다.

이는 첫 번째 파일의 텍스트를 정규식으로 사용한다는 점에 유의하세요. 문자열 비교를 수행하려면 코드에서 index(query[i],$0)in을 사용하세요 $0 ~ query[i].

결과를 다시 원본 파일에 쓰려면 출력을 로 파이프 sponge report.txt하거나 새 파일 이름으로 리디렉션한 다음 새 파일의 이름을 report.txt.

관련 정보