처음 두 열을 비교해야 하는 두 개의 파일이 있습니다.
입력 파일 예 1:
|CID|SID|order|orderdate|confirmdate
|151244127820|7177638911583| 2|2015-02-04 07:14:44|2015-02-04 07:15:32
|151244127820|7177638922976| 4|2015-02-04 07:16:19|2015-02-04 07:19:47
|151244127824|7177638920385| 2|2015-02-04 07:14:22|2015-02-04 07:18:48
|151244127824|7177638924073| 3|2015-02-04 07:18:40|2015-02-04 07:20:11
|151244127825|7177638921040| 1|2015-02-04 07:12:58|2015-02-04 07:19:02
|151244127827|7177638917056| 2|2015-02-04 07:14:17|2015-02-04 07:17:31
|151244127827|7177638968972| 3|2015-02-04 07:17:36|2015-02-04 07:36:22
입력 파일 2:
|cID|SID|order|orderdate|confirmdate
|151244127820|7177638911583| 2|2015-02-04 07:14:44|2015-02-04 07:15:32
|151244127820|7177638922976| 4|2015-02-04 07:16:19|2015-02-04 07:19:47
|151244127834|7177638920385| 2|2015-02-04 07:14:22|2015-02-04 07:18:48
|151244127834|7177638924073| 3|2015-02-04 07:18:40|2015-02-04 07:20:11
|151244126585|7177638921040| 1|2015-02-04 07:12:58|2015-02-04 07:19:02
|151244126585|7177638917056| 2|2015-02-04 07:14:17|2015-02-04 07:17:31
|151244127827|7177638968970| 3|2015-02-04 07:17:36|2015-02-04 07:36:22
입력 file2의 CID가 file1에서 발견되지 않으면 전체 라인이 새 파일에 기록됩니다. 입력 file2의 CID가 file1에 있지만 SID가 없으면 전체 줄이 새 파일에 기록됩니다.
답변1
awk -F'|' 'FNR==NR{a[$2]=$2;b[$3]=$3;next};{if($2 in a){print $0 > "new_file_1"};if(($2 in a )&& !($3 in b)){print $0 > "new_file_2"}} file1 file2
세부 사항...
{if($2 in a){print $0 > "new_file_1"} : if SID in file2 matches SID in file1 redirect to a file called new_file_1
..
if(($2 in a )&& !($3 in b)){print $0 > "new_file_2"} :if SID in file2 matches SID in file1 but CIDs does not match, redirect to a file called new_file_2
답변2
awk -F'|' '
FNR==NR{
cid[$2]=1
sid[$3]=1
next
}
{
if (!($2 in cid))
print
else
if (!($3 in sid))
print
}' file1 file2
간략한 설명:
cid
첫 번째 파일에서 두 개의 고유한 배열(및 값)을 만듭니다 .sid
그런 다음 이를 두 번째 파일 각 줄의 두 번째 및 세 번째 필드와 비교하고(첫 번째 필드는 줄의 시작부터 첫 번째 구분 기호까지 계산되므로 비어 있으므로) 용어에 따라 줄을 인쇄합니다.
답변3
나는 이것이 당신이 원하는 것을 얻을 것이라고 생각합니다 :
for n in 3 0
do nl -w1 -s."$n" <&"$n"
done 3<file1 <file2 |
sort -t\| -unk2,2 -nk3,3 |
sort -t\| -nk1,1 |
grep '^[^|]*0|'
...테스트에서 인쇄됩니다...
4.0|151244127834|7177638920385| 2|2015-02-04 07:14:22|2015-02-04 07:18:48
5.0|151244127834|7177638924073| 3|2015-02-04 07:18:40|2015-02-04 07:20:11
6.0|151244126585|7177638921040| 1|2015-02-04 07:12:58|2015-02-04 07:19:02
7.0|151244126585|7177638917056| 2|2015-02-04 07:14:17|2015-02-04 07:17:31
8.0|151244127827|7177638968970| 3|2015-02-04 07:17:36|2015-02-04 07:36:22
보세요 - 이것은 매우 간단할 뿐만 아니라(매우 큰 입력의 경우에도 매우 빠를 수 있음)- 하지만 줄 번호를 유지할 수도 있습니다. 하지만 원하지 않으면 추가할 수 있습니다.
... | cut -d\| -f2-
...파이프 끝까지.