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