bla.tsv 파일이 있습니다(FS = \t
).
>hCoV-19/xxx/xxx-YYY/xxx
>hCoV-19/xxx/xxx-ZZZ/xxx
정확한:
- 실제로 문자를 쓰면 모든 줄에 그대로 나타나기 때문이다.
- 문자가 xxx로 기록되면 표시되지만 줄마다 다르기 때문입니다(예: 문자나 숫자 또는 기타 항목의 집합일 수 있음).
- YYY와 ZZZ라는 문자는 내가 관심 있는 패턴으로 숫자나 문자일 수 있습니다.
새 열을 얻기 위해 파일을 변환하고 싶습니다.
YYY >hCoV-19/xxx/xxx-YYY/xxx
ZZZ >hCoV-19/xxx/xxx-ZZZ/xxx
/
세 번째 정규식 이후에 일치 하고 이전 정규식으로 돌아가는 정규식을 찾아야 한다는 것을 알고 있지만 -
여러 번 시도한 후에도 아직 찾지 못했습니다 https://regexr.com/
. 정규 표현식을 실행하고 결과를 첫 번째 열에 넣는 방법을 알고 있나요? 감사해요
답변1
$ cat file
>hCoV-19/xxx/xxx-YYY/xxx
>hCoV-19/xxx/xxx-ZZZ/xxx
$ awk -F '[/-]' '{ printf "%s %s\n", $5, $0 }' file
YYY >hCoV-19/xxx/xxx-YYY/xxx
ZZZ >hCoV-19/xxx/xxx-ZZZ/xxx
위의 코드 는 데이터를 awk
또는 의 필드로 구분된 /
행 으로 처리합니다 -
. 다섯 번째 필드는 각 행의 앞에 추가하려는 필드이며, 이것이 printf
바로 이 문이 수행하는 작업입니다.
구분 기호로만 사용되며 세 번째 슬래시로 구분된 필드는 좋은 구분 기호가 아닌 -
(예: 첫 번째 슬래시 앞의 문자열에 대시가 포함되지 않는 경우도 있음).경우 두 번째 비트를 앞에 추가합니다. 결과는 다음과 같습니다./
-
$ awk -F / '{ split($3,a,"-"); printf "%s %s\n", a[2], $0 }' file
YYY >hCoV-19/xxx/xxx-YYY/xxx
ZZZ >hCoV-19/xxx/xxx-ZZZ/xxx
사용 sed
:
$ sed 's/.*-\([^/]*\).*/\1 &/' file
YYY >hCoV-19/xxx/xxx-YYY/xxx
ZZZ >hCoV-19/xxx/xxx-ZZZ/xxx
또는 Plan9를 사용 중이거나 대괄호 표현식에 내부 문제가 sed
있는 Plan9 구현을 사용하는 경우 이 명령에 대해 대체 구분 기호 세트를 사용하십시오./
s///
$ sed 's,.*-\([^/]*\).*,\1 &,' file
YYY >hCoV-19/xxx/xxx-YYY/xxx
ZZZ >hCoV-19/xxx/xxx-ZZZ/xxx
여기에 사용된 정규식은 줄 /
의 마지막 문자 뒤에 문자가 포함되지 않은 하위 문자열을 캡처합니다 -
. 그런 다음 캡처된 하위 문자열과 줄 앞에 공백을 추가합니다.
sed
awk
이 솔루션과 이전 솔루션의 주요 차이점 은 awk
코드가 각 줄에 대해 필드와 유사한 구조를 사용하는 반면, 코드 sed
는 더 "엉성"하고 대시 뒤에 슬래시가 아닌 문자로 구성된 문자열을 찾는다는 것입니다.
이 https://regexr.com/
사이트는 현재 JavaScript 정규식과 Perl 호환 정규식(PCRE)을 지원합니다. 여기서는 해당 언어 중 하나를 사용하지 않으므로 사이트에서 알려주는 내용이 무엇이든 아마도 작동하지 않을 것입니다. awk
POSIX ERE(확장 정규 표현식)가 사용되고 텍스트 조작을 위한 대부분의 기타 표준 Unix 도구( BRE 포함 sed
)는 POSIX 기본 정규 표현식(BRE)을 사용합니다.
당신은 또한 볼 수 있습니다내 정규 표현식이 X에서는 작동하지만 Y에서는 작동하지 않는 이유는 무엇입니까?