2017-10-09 3 views
1

내가 이전의 두 필드는 이미 파일에서 발견 된 경우 열을 추가하려고를 추가 한 후 일치하는 경우.배쉬 - 두 개의 열이 열

나는 많은 항목이있는 쉼표로 구분 된 파일을 가지고 있고 두 개의 열, 두 번째 열 일곱 번째에 일치하는 모든 라인을 찾아야합니다. 모두가 여러 행에 발견되면 다음 "공유"라는 여덟 번째 열을 추가합니다.

파일 내용 :

WPC PROD LINUX O,1808,4194304000,10,3G,4G,66314 
WPC PROD LINUX O,1809,3145728000,10,3G,4G,66314 
WPC PROD LINUX O,1812,4194304000,10,3G,4G,66314 
WPC PROD LINUX,1808,4194304000,10,1D,2D,66314 
WPC PROD LINUX,1809,3145728000,10,1D,2D,66314 
WPC PROD LINUX,1812,4194304000,10,1D,2D,66314 
WPCESXCS40BP01_0,1808,4194304000,10,1D,2D,66314 
WPCESXCS40BP01_0,1809,3145728000,10,1D,2D,66314 
WPCESXCS40BP01_0,1812,4194304000,10,1D,2D,66314 

출력이 원하는 :

WPC PROD LINUX O,1808,4194304000,10,3G,4G,66314,shared 
WPC PROD LINUX O,1809,3145728000,10,3G,4G,66314,shared 
WPC PROD LINUX O,1812,4194304000,10,3G,4G,66314,shared 
WPC PROD LINUX,1808,4194304000,10,1D,2D,66314,shared 
WPC PROD LINUX,1809,3145728000,10,1D,2D,66314,shared 
WPC PROD LINUX,1812,4194304000,10,1D,2D,66314,shared 
WPCESXCS40BP01_0,1808,4194304000,10,1D,2D,66314,shared 
WPCESXCS40BP01_0,1809,3145728000,10,1D,2D,66314,shared 
WPCESXCS40BP01_0,1812,4194304000,10,1D,2D,66314,shared 

내가 검색 한이 링크 Awk - matching on 2 columns for differents lines를 찾았지만 꽤 내가 무엇을해야하지 않습니다, 그것은 단지 다음에 일치 선.

while IFS=',' read host device blk poolnum porta portb serial 

    ldev_count=`cat outputtest.txt | grep -iw $device | grep -iw $serial | wc -l` 
    if [[ $ldev_count > 1 ]] ; then 
     echo "$host, $device, $blk, $poolnum, $porta, $portb, $serial, SHARED" >> semifinal.txt 
    else 
     echo "$host, $device, $blk, $poolnum, $porta, $portb, $serial" >> semifinal.txt 
    fi 
done < outputtest.txt 

을하지만 매우 느린 :

나는 이런 식으로 뭔가를 할 수 있습니다. 나는 더 나은 해결책을 찾기 위해 바라고 있어요.

도움 주셔서 감사합니다.

는 다음과 같은 노력이 당신을 도움이 있으면 알려 주시기 바랍니다 수

+0

2 번째와 7 번째 열을 강조 표시 해 주실 수 있습니까?이 2 개의 열이 같은지 알 수 없으므로 혼란 스러울 수 있습니다. 그들을 강조 표시 해주시겠습니까? – RavinderSingh13

+0

은 가독성을 높이기 위해 서식을 편집했습니다. –

+0

두 행 사이에'2 & 7' 열이 공유되어 있다면 (예 :'1808'과'66314'), 두 공유 선 끝 부분에''shared "를 덧붙이 길 원할 것입니다 ? 정확히 –

답변

3

당신이해야 할 수도 있습니다

awk -F\, 'NR==FNR{a[$2]++;b[$7]++;next} 
      a[$2]>1 && b[$7]>1{$(NF+1)="shared"}1' OFS=',' file file 

결과 :

WPC PROD LINUX O,1808,4194304000,10,3G,4G,66314,shared 
WPC PROD LINUX O,1809,3145728000,10,3G,4G,66314,shared 
WPC PROD LINUX O,1812,4194304000,10,3G,4G,66314,shared 
WPC PROD LINUX,1808,4194304000,10,1D,2D,66314,shared 
WPC PROD LINUX,1809,3145728000,10,1D,2D,66314,shared 
WPC PROD LINUX,1812,4194304000,10,1D,2D,66314,shared 
WPCESXCS40BP01_0,1808,4194304000,10,1D,2D,66314,shared 
WPCESXCS40BP01_0,1809,3145728000,10,1D,2D,66314,shared 
WPCESXCS40BP01_0,1812,4194304000,10,1D,2D,66314,shared 

설명

우리는 에가는거야

파일을 반복 두 번 :

먼저

는 : NR==FNR{a[$2]++;b[$7]++;next}

우리는 각 열의 반복을 얻고 ab 배열에 저장합니다. 둘째

: $(NF+1)="shared" : a[$2]>1 && b[$7]>1{$(NF+1)="shared"}1

가 예상 담당자의 수와 일치 라인을 필터링하려면,이 숫자는 새로운 결말 열을 추가하기 위해 두 열보다 큰 일을해야합니다.

참고 : 1은 print 문 사용을 피하기위한 바로 가기입니다.

+0

이것은 완벽합니다! 대단히 감사합니다! –

2

카드를 포맷 편집.

awk -F, 'FNR==NR{a[$2,$7]++;next} a[$2,$7]>1{print $0",shared"}' Input_file Input_file 

출력은 다음과 같습니다.

WPC PROD LINUX O,1808,4194304000,10,3G,4G,66314,shared 
WPC PROD LINUX O,1809,3145728000,10,3G,4G,66314,shared 
WPC PROD LINUX O,1812,4194304000,10,3G,4G,66314,shared 
WPC PROD LINUX,1808,4194304000,10,1D,2D,66314,shared 
WPC PROD LINUX,1809,3145728000,10,1D,2D,66314,shared 
WPC PROD LINUX,1812,4194304000,10,1D,2D,66314,shared 
WPCESXCS40BP01_0,1808,4194304000,10,1D,2D,66314,shared 
WPCESXCS40BP01_0,1809,3145728000,10,1D,2D,66314,shared 
WPCESXCS40BP01_0,1812,4194304000,10,1D,2D,66314,shared 

편집

: 당신이 문자열 일치하는 라인을 인쇄 할 경우 "공유"와 일치하지 않는 선은 간단히 같은 당신을 도움이 될 수 있습니다 다음 인쇄 할 수 있습니다.

awk -F, '   ##Creating field delimiter as comma. 
FNR==NR{   ##FNR==NR is a condition which will be TRUE when first Input_file is being read. 
    a[$2,$7]++;  ##creating an array named a whose index is $2,$7(second and 7th field) and incrementing its value with 1 each time same elements come. 
    next    ##Using next keyword will skip all further statements. 
} 
a[$2,$7]>1{   ##This condition will be TRUE only when 2nd Input_file is being read, check if array a value in index of $2,$7 is greater than 1. 
    print $0",shared" ##Printing the current line with keyword shared at last of line. 
    next; 
} 
1 
' Input_file Input_file ##Mentioning the Input_file twice here. 
+0

정확히 내가 요청한 것을 수행합니다. 일치하지 않는 행을 인쇄하는 방법이 있습니까? –

+0

@ LukeFowler, 내 편집 솔루션을 확인하고이 도움이 될지 알려주실 수 있습니까? – RavinderSingh13

관련 문제