2016-06-28 2 views
1

탭으로 구분 된 파일이 있으며 cut으로 몇 개의 열을 추출하려고합니다.Bash : 컷이있는 열을 추출하고 한 열을 더 필터링하십시오.

두 예 라인은

(...) 
0 0 1 0 AB=1,2,3;CD=4,5,6;EF=7,8,9 0 0 
1 1 0 0 AB=2,1,3;CD=1,1,2;EF=5,3,4 0 1 
(...) 

내가 달성하고자하는 것은 그러나 열 5 단 CD=4,5,6에서 열 2,3,5 7을 선택하는 것입니다.

그래서 내 예상 결과는

입니다
0 1 CD=4,5,6; 0 
1 0 CD=1,1,2; 1 
나는이 문제에 대한 잘라 추출 된 열 중 하나에 grep를 실행 사용하는 방법

? 그 밖의 다른 하나의 라이너도 물론 좋습니다.

+0

이가 있습니까 '컷 '으로 끝내야합니까? 'awk'는이 컬럼에서'split()'함수를 사용하여 그 일부를 추출 할 수 있으므로 훨씬 더 유용합니다. – Barmar

+0

그는 다른 one-liner도 괜찮다고 말했기 때문에 앞으로 가서 awk 대답을 줄 수 있습니다. – Andrew

+0

awk도 완벽하게 괜찮습니다. – maxie

답변

4

는 또 다른

$ awk -F'\t|;' -v OFS='\t' '{print $2,$3,$6,$NF}' file 

0  1  CD=4,5,6  0 
1  0  CD=1,1,2  1 

또는 잘라 내기/붙여 넣기와 awk

$ paste <(cut -f2,3 file) <(cut -d';' -f2 file) <(cut -f7 file) 

0  1  CD=4,5,6  0 
1  0  CD=1,1,2  1 
+0

내가 가장 좋아하는 솔루션은'cut'과'paste'입니다. – maxie

3

더 쉽게 완료하려면 awk. 구분 기호로 ;을 사용하여 다섯 번째 필드를 분할 한 다음 두 번째 하위 필드를 인쇄하십시오.

awk 'BEGIN {FS="\t"; OFS="\t"} 
    {split($5, a, ";"); print $2, $3, a[2]";", $7 }' inputfile > outputfile 

당신이 CD= 시작 중 서브 필드 인쇄 할 경우, 루프 사용

여기
awk 'BEGIN {FS="\t"; OFS="\t"} 
    {n = split($5, a, ";"); 
     for (i = 1; i <= n; i++) { 
     if (a[i] ~ /^CD=/) subfield = a[i]; 
     } 
     print $2, $3, subfield";", $7}' <inputfile> outputfile 
+0

다섯 번째 필드의 항목 수가 항상 같지 않고 (항상'CD = ... '를 포함하지 않는 경우) 무엇이 변경됩니까? – maxie

+1

그래서 다섯 번째 필드에서'CD ='로 시작하는 항목을 인쇄하려고합니다. 항상 두 번째 항목이 아닌가요? 결과는 예제 입력 파일과 동일하기 때문에 질문에서 분명하지 않습니다. – Barmar

+0

사실입니다. 처음부터 나에게 명확하지 않은 점을 지적 해 주셔서 감사합니다. – maxie

1

awk 작업 의이 종류를위한 최고의 도구라고 생각하고 다른 두 가지 대답은 당신에게 좋은 짧은 솔루션을 제공합니다.

awk's 내장 분할 기능을 사용하여 입력을 구문 분석 할 때 더 많은 유연성을 얻을 수 있다고 지적하고 싶습니다.

# Remember second, third and seventh columns 
{ 
    a = $2 
    b = $3 
    d = $7 
} 

# Split the fifth column on ";". After this the positional variables 
# (e.g. $1, # $2, ..., $NF) contain the fields from the previous 
# fifth column 
{ 
    oldFS = FS 
    FS = ";" 
    $0 = $5 
} 

# For example to test if the second elemnt starts with "CD", do 
# something like this 
$2 ~ /^CD/ { 
    c = $2 
} 

# Print the selected elements 
{ 
    print a, b, c, d 
} 

# Restore FS 
{ 
    FS = oldFS 
} 

실행을이 같은

parse.awk : 여기에 암시 적 분할을 사용하는 예제 스크립트입니다

awk -f parse.awk FS='\t' OFS='\t' infile 

출력 :

0 1 CD=4,5,6 0 
1 0 CD=1,1,2 1 
관련 문제