다음과 같은 데이터 파일이 있습니다.
file1:
c1.212 3.4 90
c1.011 4.4 33
c2.09432 7.7 76
c3.0911 8.3 83
c3.1121 4.3 23
c3.2223 2.2 22
c3.1211 2.2 12
c4.1211001 1.2 11
c4.1111222 1.2 10
c4.0000011 99 76
c5.123 11 01
c5.113 11 01
...
두 번째 파일은 다음과 같습니다.
c1.212
c3.2223
c3.0911
c5.113
...
파일 1에서 볼 수 있듯이 첫 번째 열의 정보를 기반으로 5개의 그룹(c1, c2, c3, c4 및 c5)이 있으며 각 그룹에는 서로 다른 수의 하위 집합이 있습니다(예: c1에는 2개의 하위 집합이 있지만 c2에는 하위 집합이 있음) 두 번째 파일에는 3개의 그룹(c1, c3 및 c5)이 있습니다. 내가 원하는 것은 file2에서 관찰된 그룹과 해당 하위 집합이 모두 file1에 남아 있고 file2에서 관찰되지 않은 그룹(c1 및 c4)이 file1 및 모든 하위 집합에서 제거되는 경우입니다. 따라서 출력은 다음과 같아야 합니다.
output:
c1.212 3.4 90
c1.011 4.4 33
c3.0911 8.3 83
c3.1121 4.3 23
c3.2223 2.2 22
c3.1211 2.2 12
c5.123 11 01
c5.113 11 01
...
어떤 조언이라도 대단히 감사하겠습니다. (실제 파일에는 45,000줄이 넘습니다)
답변1
join
더하기 기호 사용uniq
join -t '.' -o 1.1,1.2 file1 file2 | uniq
이렇게 하면 "."의 각 파일이 "분할"됩니다. 문자를 입력하고 첫 번째 필드와 일치하는 행을 출력합니다. "-o" 옵션은 Join에 file1의 처음 두 필드만 출력하도록 지시합니다.
내가 대답한 후에 질문을 변경했기 때문에 지금은 작동하지 않습니다. :) sed
첫 번째 "."를 탭이나 고유 문자로 바꾸기 위해 파일을 전처리합니다.
답변2
이거 좋은 awk
단골 이네
awk -F. 'NR==FNR {a[$1]++; next} $1 in a' file2 file1
c1.212 3.4 90
c1.011 4.4 33
c3.0911 8.3 83
c3.1121 4.3 23
c3.2223 2.2 22
c3.1211 2.2 12
c5.123 11 01
c5.113 11 01
또는 그룹 식별자( c1
etc. c2
)가 파일의 다른 곳에 나타나지 않는다고 가정하면 cut
추출 식별자를 사용한 다음 grep
첫 번째 파일에서 일치시킬 수 있습니다.
$ cut -d. -f1 file2 | grep -Fwf- file1
c1.212 3.4 90
c1.011 4.4 33
c3.0911 8.3 83
c3.1121 4.3 23
c3.2223 2.2 22
c3.1211 2.2 12
c5.123 11 01
c5.113 11 01