이 파일을 Linux에서 변환하고 싶습니다...
1:a:A:G rs123
1:b:C:T rs456
1:c:G:A,C rs174
이 파일의 경우...
1:a rs123
1:b rs456
1:c rs174
이 작업을 수행하는 방법을 아는 사람이 있나요? 미리 감사드립니다!
답변1
모든 입력 값이 일치하면 다음 두 가지를 제외한 모든 열을 인쇄하십시오.
awk -F'[: ]' '{ print $1":"$2" "$5 }' inputFile
답변2
@terdon의 솔루션에는 아무런 문제가 없지만 재미로 gawk
솔루션을 사용하십시오.
awk -F':[^a-z]+' '{print $1, $2}' file1
연속된 문자열 시작과 일치하는 IFS
컨텍스트를 형성하고 소문자를 제외한 모든 항목의 가변 길이 조합을 사용하여 원하는 두 블록만 남깁니다.regex
:
[^a-z]+
답변3
몇 가지 옵션:
$ awk -F'[: ]' '{print $1":"$2,$5}' file
1:a rs123
1:b rs456
1:c rs174
이는 awk
공백이나 a를 :
필드 구분 기호로 사용한 다음 첫 번째 필드인 a :
, 두 번째 필드 및 다섯 번째 필드를 인쇄하도록 지시합니다.
$ sed -E 's/^([^:]*:[^:]*):.* (.*)$/\1 \2/' file
1:a rs123
1:b rs456
1:c rs174
여기서는 줄의 시작 부분( )부터 첫 번째( )까지의 sed
모든 비문자 -:
와 다음 비문자부터 두 번째까지 캡처됩니다. 그런 다음 줄의 마지막 공백까지 모든 것을 일치시키고 그 이후의 모든 문자를 캡처합니다. 마지막으로 전체 라인이 캡처된 두 패턴( )으로 대체됩니다.[^:]*
^
:
:
:
\1 \2
$ perl -pe 's/(.+?:.+?):.*\s(\S+)$/$1 $2/' file
1:a rs123
1:b rs456
1:c rs174
이는 위의 sed 방법과 기본 아이디어가 동일하지만 탐욕스럽지 않은 정규식 패턴을 사용하고 줄의 마지막 공백 문자 뒤에서 공백이 아닌 문자를 검색합니다.
답변4
모든 GNU coreutil 솔루션 외에도 vim
열고 다음을 입력해도 작동합니다.
:%norm 0f:f:vf hd
.Enter
할 수 있는 작업:
:
명령 모드로 전환
%
norm
수정자는 파일의 모든 줄에서 실행 되었습니다.
norm
일반 모드에서 뒤에 오는 내용을 입력한 것처럼 여러 줄에서 실행할 수 있는 명령입니다.
0
줄의 시작 부분에 도달
f:
텍스트에서 다음 콜론 기호(예: 필드 구분 기호) 항목으로 이동합니다. 세 번째 열의 시작 부분에 도달하려면 이 작업을 두 번 수행하세요.
v
시각적 모드로 들어갑니다. (삭제할 항목을 더 쉽게 선택할 수 있습니다 :-) )
f˽
(공백에 주의하세요!!) 다음 공백(예: 다른 필드 구분 기호)으로 이동하고
h
한 문자를 왼쪽으로 이동한 다음(선택 항목을 제거할 때 공백을 제거하지 않음) 마지막으로
d
선택한 콘텐츠 삭제