awk는 열이 존재하지 않으면 추가합니다.

awk는 열이 존재하지 않으면 추가합니다.

3열(설명)에 ";"이 없으면 추가하여 파일을 구분하고 싶습니다. 예;

#Gene;Transcripts;Description;Group
gene1;G1a,G1b,G1c;gene1 is a good gene;6
gene2;G2a,G2b,G2c;gene2 is a funny gene;3
gene3;G3a,G3b;4
gene4;G4a;gene4 description;5
gene5;G5a,G5b;6

예상 출력

#Gene;Transcripts;Description;Group
gene1;G1a,G1b,G1c;gene1 is a good gene;6
gene2;G2a,G2b,G2c;gene2 is a funny gene;3
gene3;G3a,G3b;No description;4
gene4;G4a;gene4 description;5
gene5;G5a,G5b;No description;6

답변1

이를 보는 약간 다른 방법은 "4개의 데이터 열이 없는 경우 열 3을 열 4로 이동하고 열 3을 설명 없음으로 설정"하는 것입니다.

결과적으로 다음 코드가 생성됩니다.

awk -F';' 'BEGIN {OFS=";"} NF!=4 {$4=$3; $3="No description"} {print}'

답변2

사용 miller:

$ mlr --nidx --fs ';' put 'if (NF != 4) {$4 = $3; $3 = "No description"}' file

이는 awk답변에 사용된 것과 동일한 방법 이지만 miller.

아래와 같이 파일의 세 번째 열이 비어 있는 경우

Gene;Transcripts;Description;Group
gene1;G1a,G1b,G1c;gene1 is a good gene;6
gene2;G2a,G2b,G2c;gene2 is a funny gene;3
gene3;G3a,G3b;;4
gene4;G4a;gene4 description;5
gene5;G5a,G5b;;6

그런 다음 다음 명령을 사용할 수 있습니다.

# With headers 
$ mlr --csv --fs ';' put 'is_null($Description) {$Description = "No description" }' file 

# Without headers
$ mlr --csv  -N --fs ';' put 'is_null($3) {$3 = "No description"}' file

답변3

@Stephen Harris의 답변이 awk최고의 IMHO입니다. 하지만 perl이것도 선택사항이기 때문에 다른 방법도 많이 있습니다.

;2개 ( ) 만 있는 경우 y/;/;/==2세 번째 열이 누락된 것이므로 설명을 추가하세요 No description.

perl -pe's/(;[^;]+$)/;No description$1/ if y/;/;/==2' data

perl또는 기본적으로 @Stephen Harris의 답변을 번역한 것입니다 awk.

perl -F'/;/' -spe'$_=join $,,@F[0..1],q^No description^,$F[2] if $#F==2' -- -,=';' data.csv

답변4

완전성을 위해 질문 sed에도 태그가 지정되어 있으므로 여기서는 열 기반이 아닌 정규식 기반입니다.sed해결책(참고: 이는 정규식 그룹만큼 좋습니다...따라서 필요에 따라 조정하세요.):

$ sed -E 's/^([^;]+);([^;]+);([0-9]+)$/\1;\2;No description;\3/' file
#Gene;Transcripts;Description;Group
gene1;G1a,G1b,G1c;gene1 is a good gene;6
gene2;G2a,G2b,G2c;gene2 is a funny gene;3
gene3;G3a,G3b;No description;4
gene4;G4a;gene4 description;5
gene5;G5a,G5b;No description;6

관련 정보