awk - 행이 아직 존재하지 않는 경우에만 행을 추가합니다.

awk - 행이 아직 존재하지 않는 경우에만 행을 추가합니다.

나는 그것을 사용하여 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

관련 정보