두 개의 파일이 있습니다.
파일 1:
No ID CV CA1 CA2
1 transcr_10283 0.999023367236861 -0.344113101336184 -0.032235130455987
2 transcr_10371 -0.572755303094372 -0.579145581184253 0.879510598089221
3 transcr_10391 0.999589933675858 -0.379226454955611 -0.302057879326854
4 transcr_10428 0.128862262957329 0.579502720160717 -0.960283285879896
5 transcr_10673 -0.555906836336222 0.996418809959179 0.83927901939441
6 transcr_10719 -0.977601905205625 -0.297994976855801 -0.988480730161833
7 transcr_10805 -0.994387636575223 -0.924363947763111 -0.096820331033279
8 transcr_1084 0.929966893591254 0.994040100421911 0.604483398826667
9 transcr_10892 0.987734223438821 0.822187392097743 0.968727545498998
10 transcr_10892 0.999938729100654 -0.985209499864003 0.958993756142276
파일 2:
No ID CV CA1 CA2
1 transcr_8921 0.972442945255909 0.937065785923838 0.999643394568925
2 transcr_10428 0.128862262957329 0.808685528374441 -0.987431892147214
3 transcr_25793 -0.576556453265197 0.956853490465593 -0.712579124289414
4 transcr_1966 0.66610055219078 0.199587132187484 0.47438019134052
5 transcr_10428 -0.770206245250698 -0.434541952574813 0.413082695627957
6 transcr_20649 0.828958672046763 -0.301011711451322 0.85215236415901
7 transcr_11317 0.09699438477018 -0.728279374568874 -0.555587423971877
8 transcr_11317 -0.556544875244594 0.52241898249443 0.361144169769576
9 transcr_7135 0.525796225375268 -0.915309254508446 0.352117890583668
10 transcr_6234 -0.254737326090742 -0.842640701643698 0.435449408114073
file1
(낮은 행 수) 및 ( file2
더 높은 행 수)를 사용하는 열이 있는 결과 파일이 필요합니다 . 따라서 다음과 같은 것을 찾고 있습니다.$2
$3
No ID CV CA1 CA2
1 transcr_10283 0.999023367236861 -0.344113101336184 -0.032235130455987
2 transcr_10371 -0.572755303094372 -0.579145581184253 0.879510598089221
3 transcr_10391 0.999589933675858 -0.379226454955611 -0.302057879326854
5 transcr_10673 -0.555906836336222 0.996418809959179 0.83927901939441
6 transcr_10719 -0.977601905205625 -0.297994976855801 -0.988480730161833
7 transcr_10805 -0.994387636575223 -0.924363947763111 -0.096820331033279
8 transcr_1084 0.929966893591254 0.994040100421911 0.604483398826667
9 transcr_10892 0.987734223438821 0.822187392097743 0.968727545498998
10 transcr_10892 0.999938729100654 -0.985209499864003 0.958993756142276
File2가 정렬되지 않았는데 파일을 정렬하지 않고 할 수 있는 방법을 찾고 있습니다.
감사해요!
편집: 보기 쉽게 하기 위해 transcr_10428 0.128862262957329
이 예에서는 for 줄이 제거되었습니다.
답변1
그리고 awk
:
$ awk -v FS="\t" -v OFS="\t" 'NR==FNR {trans[$2"|"$3]++; next;} FNR==1 {print} FNR>1 {if(!trans[$2"|"$3]) print}' file2 file1
- 먼저
file2
2열과 3열의 값을 읽어서 사용하여 목록의 키로 저장합니다. - 읽어들인 경우
file1
헤더 행을 인쇄합니다. 다음 줄에서는 앞서 생성한 목록에 2열과 3열 값을 가진 키가 존재하는지 확인합니다. 그렇지 않은 경우 해당 행을 인쇄합니다.
답변2
파일을 비교하는 방식이 명확하게 설명/정의되지 않았습니다.
하지만 그렇다고 해서 내가 당신의 마음을 읽으려고 노력하는 것을 막지는 못해요...
내가 아는 한, 파일 2는 일종의 데이터베이스 파일 또는 참조입니다. 파일 1에는 새로운 데이터가 포함되어 있는 것으로 알려졌습니다.
내가 이해하는 "비교": 파일 1의 열 2 또는 3의 값이 이미 파일 2(즉, 참조)에 있는 경우 이를 인쇄/포함하지 마세요. 그렇지 않으면 인쇄/포함하세요.
좋은 소식은 요청하신 대로 정렬이 필요하지 않다는 것입니다...
다음은 2개의 매개변수를 사용하는 스크립트입니다. 첫 번째 매개변수는 새 데이터 파일(예제에서는 파일 1)입니다. 두 번째는 데이터베이스 파일입니다(예제에서는 파일 2).
#!/bin/bash
new_file=$1
db_file=$2
# Just checking the last parameter
if [ "x" = "x$db_file" ]; then
echo >&2 "[ERROR] This scripts expect 2 file path as parameter."
exit 1
fi
if [ ! -f $new_file ]; then
echo >&2 "[ERROR] First parameter file doesn't exist."
exit 2
fi
if [ ! -f $db_file ]; then
echo >&2 "[ERROR] First parameter file doesn't exist."
exit 3
fi
declare -A data_base
# Open both files and assign to file descriptor 10 and 11
exec 10< $new_file
exec 11< $db_file
# Step 1
# Building map of base data first (for the comparison to happen in next step)
first_line=1
while [ /bin/true ];
do
read -u 11 db_file_col1 db_file_col2 db_file_col3 db_file_rest || {
break;
}
# Skipping the header so that it will appear in the diff as shown in the example
if [ $first_line -ne 0 ]; then
first_line=0
continue
fi
# Creating map from Col 2 and Col 3 (keys) to the whole line (value)
data_base[$db_file_col2]="$db_file_col1 $db_file_col2 $db_file_col3 $db_file_rest"
data_base[$db_file_col3]="$db_file_col1 $db_file_col2 $db_file_col3 $db_file_rest"
done
# Step 2
# Actual comparison ...
while [ /bin/true ];
do
read -u 10 new_file_col1 new_file_col2 new_file_col3 new_file_rest || {
break;
}
if [ -z "${data_base[$new_file_col2]}" ] && [ -z "${data_base[$new_file_col3]}" ]; then
echo "$new_file_col1 $new_file_col2 $new_file_col3 $new_file_rest"
fi
done
예를 들어 스크립트를 process.sh라는 파일에 저장한 다음 "chmod 755 process.sh"를 사용하여 실행 가능하게 만드는 경우 다음을 수행합니다.
./process.sh file1 file2
정확한 예상 출력/결과로 이어집니다.
참고: 이 스크립트는 파일 2 내용의 두 배 이상을 메모리에 저장합니다. 메모리가 충분한지 확인하세요....