![단일 문자만 포함하는 awk 필터 라인](https://linux55.com/image/205774/%EB%8B%A8%EC%9D%BC%20%EB%AC%B8%EC%9E%90%EB%A7%8C%20%ED%8F%AC%ED%95%A8%ED%95%98%EB%8A%94%20awk%20%ED%95%84%ED%84%B0%20%EB%9D%BC%EC%9D%B8.png)
아래와 같은 파일(file1)이 있습니다.
ROW 1 AA 120 APFGHKDESFNNJFHGRIHJASFGNSKDHFIXXXXXX
ROW 2 AA 234 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
ROW 3 AA 122 XXXXXXXXXXXXXXXXXXXXX
ROW 4 AA 89 WUAHGLIHGUNGBGDSYUXXXXXXXXXXXXXXFGOAYGIGWEIWIGFUEGFHUIWGEFU
ROW 5 AA 186 XXWANFJHOUNGRIGNO
ROW 6 AA 156 WANLHRIOGRNINGIJOHONJPHHYGKHDY
...
서로 다른 개수의 X가 포함된 여러 행이 있습니다. 그러나 결과에는 X로만 구성된 행이 포함되어서는 안 됩니다. 다음과 같아야 합니다.
ROW 1 AA 120 APFGHKDESFNNJFHGRIHJASFGNSKDHFIXXXXXX
ROW 4 AA 89 WUAHGLIHGUNGBGDSYUXXXXXXXXXXXXXXFGOAYGIGWEIWIGFUEGFHUIWGEFU
ROW 5 AA 186 XXWANFJHOUNGRIGNO
ROW 6 AA 156 WANLHRIOGRNINGIJOHONJPHHYGKHDY
...
당신의 도움을 주셔서 감사합니다!
답변1
대신 을 사용하여 awk
마지막 필드에 문자가 하나 이상 있는 줄을 인쇄합니다 X
.
awk '$NF ~ /[^X]/' file
ROW 1 AA 120 APFGHKDESFNNJFHGRIHJASFGNSKDHFIXXXXXX
ROW 4 AA 89 WUAHGLIHGUNGBGDSYUXXXXXXXXXXXXXXFGOAYGIGWEIWIGFUEGFHUIWGEFU
ROW 5 AA 186 XXWANFJHOUNGRIGNO
ROW 6 AA 156 WANLHRIOGRNINGIJOHONJPHHYGKHDY
또는 다음을 사용하여 grep
:
grep -v '[[:space:]]XX*$' file
답변2
sed
기준을 사용하여 끝에 공백만 포함된 모든 줄을 제거합니다 .X
sed '/ X\{1,\}$/d' file
또는,
sed '/ XX*$/d' file
sed
옵션이 제공되면 확장 정규식을 이해할 수 있습니다 -E
.
sed -E '/ X+$/d' file
파일의 구분 기호가 공백이 아닌 탭 문자인 경우 [[:blank:]]
표현식의 초기 공백 대신 사용됩니다.
위(및 아래)의 각 sed '/RE/d'
변형 에 대해 해당 grep
명령은 grep -v 'RE'
다음과 같습니다.
grep -v ' X\{1,\}$' file
동등하다
sed '/ X\{1,\}$/d' file
사본만 포함된 행 삭제어느끝에는 단일 문자가 있습니다.
sed '/ \(.\)\1*$/d' file
이는 공백과 일치하고 그 뒤에 특정 문자가 오고 그 다음에는 해당 특정 문자가 0개 이상 줄 끝까지 옵니다. 일치하는 행이 삭제됩니다.
동일한 아이디어를 사용하여 다음은 ABCABC
끝에서 반복되는 시퀀스(예: 또는 )만 포함하는 줄을 제거합니다.ABABABAB
sed '/ \(..*\)\1\1*$/d' file
답변3
마지막 필드 대신 모든 필드를 확인하려면 다음을 수행하세요.
awk -F'(^|[\t ]+)X+([\t ]+|$)' 'NF==1' infile
또는 루프를 사용하여 각 필드를 명시적으로 확인합니다.
awk '{ for(i=1; i<=NF; i++) if($i ~/^X+$/)next };1' infile
아니면 sub() 함수를 사용하고 단어 경계에 의존합니다(GNU awk?).
awk '{ bkp=$0; if(! sub("\\<X+\\>", "")) print bkp }' infile
답변4
awk -F ' X+$' 'NF == 1' file
아무 공간에서나 줄을 나눈 다음 끝까지 쭉 뻗습니다 X
. 레코드가 하나만 있는 경우 마지막 필드는 X
.
perl -alne 'print if $F[-1] =~ y/X/-/ != length $F[-1]' test
마지막 필드의 음역 수가 필드 길이와 같은 경우 전체 마지막 레코드가 에 의해 생성됩니다 X
.