나는 그것을 사용하여 awk
파일을 구문 분석하고 해당 줄이 아직 존재하지 않는 경우에만 줄을 추가하고 싶습니다.
내 파일:
cccc
dddd
aaaa
mmm
실시예 1: 내가 찾고 있어요"아아아아"
"aaaa"가 존재하므로 아무 일도 일어나지 않으며 출력 파일은 동일합니다.
실시예 2: 내가 찾고 있어요"부부"
"bbbb"이(가) 존재하지 않습니다. 내 출력 파일은 다음과 같아야 합니다.
cccc
dddd
aaaa
mmm
bbbb
이 결과를 어떻게 얻을 수 있나요?
답변1
$ awk -v x='aaaa' '$0 == x {found=1} END {if(!found) print x} 1' file
cccc
dddd
aaaa
mmm
$ awk -v x='bbbb' '$0 == x {found=1} END {if(!found) print x} 1' file
cccc
dddd
aaaa
mmm
bbbb
답변2
한번에 처리하고 싶다면
line=aaaa
grep -Fx -q "$line" file || echo "$line" >> file
모든 가능성을 미리 알고 있다면 더 효율적일 수 있습니다.
$ cat lines_to_add
aaaa
bbbb
$ grep -Fx -f file -v lines_to_add >> file
$ cat file
cccc
dddd
aaaa
mmm
bbbb
답변3
GNU sed가 있다면 이것은 멋진 옵션입니다:
$ sed -z '/bbbb/!s/$/bbbb\n/' file > file.out
$ cat file.out
cccc
dddd
aaaa
mmm
bbbb
이 -z
플래그는 sed가 파일을 개행으로 구분된 것이 아니라 널 바이트로 구분된 것으로 해석하도록 합니다. 이렇게 하면 모든 행이 패턴 공간에 즉시 입력되고, 전체 파일( )에서 정규식이 발견되지 않으면 /bbbb/!
발견되지 않은 행과 줄 바꿈이 파일( )의 끝에 추가됩니다 s/$/bbbb\n/
. POSIX 표준에 따르면 마지막 개행 문자가 필요합니다. 그렇지 않으면 출력 파일은 텍스트 파일이 아닙니다.
라인을 변수로 제공하려면 다음을 수행하십시오.
line=bbbb
sed -z /"$line"'/!s/$/'"$line"'\n/' file > file.out
답변4
awk로 이를 수행하는 한 가지 방법은 입력 파일을 두 번 제공하는 것입니다.
$ awk '
FNR == NR { next }
/bbbb/, 0 { print; next }
NR == 2*FNR { $0 = $0 ORS "bbbb"}1
' file file
위와 동일한 방법이지만 sed 명령을 사용합니다.
sed -e '
/bbbb/,$b
$a bbbb
' file