내 파일은 두 필드 사이의 구분 기호(\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
대체의 개행 문자 앞에는 백슬래시가 와야 합니다.
p
ubstitute 명령의 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};'