두 번째 필드가 비어 있으면 행을 삭제합니다.

두 번째 필드가 비어 있으면 행을 삭제합니다.

내 파일은 두 필드 사이의 구분 기호(\t)입니다.

1   a
2   b
3   
4   d
5
6   e

중간 파일을 받고 싶습니다.

1  a
2  b
4  d
6  e

그리고 최종 문서

>1
a
>2
b
>4
d
>6
e

답변1

다음이 포함된 경우 file:

$ cat file
1   a
2   b
3   
4   d
5
6   e

여러 공백이나 탭을 구분 기호로 가정하고 다음을 시도해 보세요.

$ awk '$2!=""' file
1   a
2   b
4   d
6   e

중간 파일의 경우 다음과 같습니다.

$ awk '$2!=""{printf ">%s\n%s%s",$1,$2,ORS}' file
>1
a
>2
b
>4
d
>6
e

최종 문서를 얻으려면.

답변2

질문에 태그를 달았 awk지만 일부 외로운 sed -i장난을 치고 있으므로 감히 sed해결책을 제시하겠습니다.

sed -En 's/^([0-9]+)[[:space:]]+([[:alnum:]]+)$/>\1\
\2/p' yourfile

이는 "채우기" 줄을 세 부분으로 나눕니다.

  • 처음에 숫자^[0-9]+
  • 스페이스 또는 탭[[:space:]]+
  • 문자 및 숫자의 두 번째 열[[:alnum:]]+

첫 번째와 세 번째 부품은 ()교체 시 \1재사용이 가능하도록 둘러싸여 있습니다.\2

대체의 개행 문자 앞에는 백슬래시가 와야 합니다.

pubstitute 명령의 rint 플래그는 대체가 가능한 경우에만 버퍼를 출력하는 반면, 이 옵션은 다른 출력을 억제합니다. 이렇게 하면 두 번째 항목이 있는 행만 처리됩니다.s-n

답변3

사용행복하다(이전 Perl_6)

raku -ne '.put if .words[1];'  

입력 예:

1   a
2   b
3   
4   d
5
6   e

출력 예(1):

1   a
2   b
4   d
6   e

샘플 출력(1)을 샘플 출력(2)으로 변환하려면:

raku -ne '.map(">" ~ *).words.join("\n").put;' 

#OR

raku -ne '.put for .map(">" ~ *).words;'  

출력 예(2):

>1
a
>2
b
>4
d
>6
e

요약하면 [샘플 입력(2)에서 샘플 출력 생성]:

raku -ne '.map(">" ~ *).words.join("\n").put if .words[1] ;' 

#OR

raku -ne 'if .words[1] {.put for .map(">" ~ *).words};' 

https://raku.org

관련 정보