열 내의 값 일치

열 내의 값 일치

약 1500개 이상의 줄이 포함된 탭으로 구분된 텍스트 파일이 있습니다.

입력.txt

id   sno1   
EN1  Nucus_2158_mri_1/2_Co_1.0_Le_3104
EN2  Nucus_2158_mri_4/2_Co_1.0_Le_3104
EN3  Nucus_2158_mri_1/2_Co_1.0_Le_3104
EN4  Nucus_2158_mri_1/2_Co_1.0_Le_3106
EN5  Nucus_2158_mri_1/2_Co_1.0_Le_3104
EN6  Nucus_2159_mri_1/2_Co_1.0_Le_3104

Nucus_{2158}_mri_{1/2}_Co_1.0_Le_{3104}대괄호( ) 안의 값을 캡처하고 일치하는 ID 목록을 인쇄하여 열(sno1)에서 정확히 일치하는 항목을 얻고 싶습니다 . awk/sed에 대한 도움을 주시면 감사하겠습니다.

출력.txt

Nucus_2158_mri_1/2_Co_1.0_Le_3104 EN1,EN3,EN5

답변1

전체 두 번째 요소가 모든 경우에 동일하다고 가정하면 이를 연관 배열의 키로 사용할 수 있습니다. 여기 awk에 의존하는 예가 있습니다 :

awk '
/^EN/ {
  if(H[$2] == "")
    H[$2] = $1
  else
    H[$2] = H[$2]","$1
}
END {
  for(key in H)
    print key, H[key]
}' infile

산출:

Nucus_2158_mri_4/2_Co_1.0_Le_3104 EN2
Nucus_2159_mri_1/2_Co_1.0_Le_3104 EN6
Nucus_2158_mri_1/2_Co_1.0_Le_3104 EN1,EN3,EN5
Nucus_2158_mri_1/2_Co_1.0_Le_3106 EN4

답변2

awk 명령줄 변수를 사용하여 세 개의 키(아래 예에서는 첫 번째, 두 번째, 세 번째로 명명됨)를 전달합니다.

awk -v first=2158 -v second=1/2 -v third=3104 
'$2 == "Nucus_"first"_mri_"second"_Co_1.0_Le_"third{print($2,$1)}' input.txt      
| awk '{deleter=$1; gsub(deleter, "", $0);} NR != 1 {deleter=""}{print(deleter" "$0)}' 
| sed -e 's/^\s\+//g' | sed ':a;N;$!ba;s/\n/,/g'

관련 정보