텍스트를 awk로 바꾸기

텍스트를 awk로 바꾸기

2개의 열이 있는 텍스트 파일이 있습니다. 첫 번째 항목에는 코드 목록(예: GRT986E)이 포함되어 있거나 다른 경우에는 낮은 대시(예: TRY546_TRE578)로 구분된 두 부분으로 구성된 개체가 있습니다. 개체 사이에 하나 이상의 빈 줄이 있는 경우도 있습니다. 두 번째 열의 일부 개체에는 관련 변수가 있습니다. 파일은 다음과 같습니다.

QR846OI bbbbbbbbb

PO3R56  ddddddd
UJ6Y68 eeeeeee


YU654R

PL92WS
GH654Y _ HUY765R tttttt

두 번째 열을 가져오고 텍스트를 "is"로만 바꾸고 싶고 첫 번째 열과 두 번째 열을 ","로 구분하고 싶습니다. 출력 .txt는 다음과 같습니다.

QR846OI,yes

PO3R56,yes
UJ6Y68,yes


YU654R

PL92WS
GH654Y _ HUY765R,yes

나는 다음 명령줄을 사용합니다.

awk -F , '{ if ($2 != " ") $2="yes";}1' OFS=, good_interactors.txt > output.txt

하지만 효과는 별로 좋지 않습니다.

답변1

밑줄 주위의 공백을 제거한 sed다음 선택적으로 복원하겠습니다. 이렇게 하면 더 쉬워집니다 awk.

awk '{OFS=","}NF==2{$2="yes"}1' <(sed 's/ _ /_/g' file) \
| sed 's/_/ _ /g' # <- this part is optional

산출:

QR846OI,yes

PO3R56,yes
UJ6Y68,yes


YU654R

PL92WS
GH654Y _ HUY765R,yes

답변2

노력하다

 awk 'NF>1 {$NF="yes" ; print ; } NF <= 1 { print }' file | sed 's/ yes/,yes/'
  • 이 필터는 NF(필드 수)를 대상으로 합니다.

  • sed공백을 제거하는 명령

  • 1대신 사용하시는 분들도 계시 더라구요print

    awk 'NF>1 {$NF="yes" ; }1' file | sed 's/ yes/,yes/'
    

답변3

올바른 awk:

awk -v repl=",yes" '
  BEGIN {
    s = "[[:space:]]"; S = "[^[:space:]]"
    pat = sprintf("%s+%s+%s*$", s, S, s)
  }
  NF>1 && sub(pat, repl) || 1' file

관련 정보