簡體   English   中英

使用awk根據條件比較兩個文件

[英]Compare two files based on the condition using awk

我有兩個文件:

1.txt:

j_e_s_s_i_c_a_a_n_n zoltan670605@freemail.hu  61b8a203438ea1c56c1489ec7bea7a0e
9871951 sexbollente@hotmail.com 671cb9239bf797a082f723a07a9c713f
holliebrian nnagle1@yahoo.com a2e531ea7df55290c35d74082f38f020
9075407 car_jacko@hotmail.fr  d20f83ee6933aa1ea047fe5cbd9c1fd5
9837056 alainkp@gmail.com e4d11b1c62cfbb7bfb49e4644e70d476

2.txt:

a2e531ea7df55290c35d74082f38f020:182:@*/
671cb9239bf797a082f723a07a9c713f:1199
e4d11b1c62cfbb7bfb49e4644e70d476:abcd123
d20f83ee6933aa1ea047fe5cbd9c1fd5:33;1:11

我希望將兩個文件作為輸出:一個為left.txt,其中1.txt的行將存在,其第三列(FS ='')與2.txt(FS =':')的第二列不匹配

left.txt:

j_e_s_s_i_c_a_a_n_n zoltan670605@freemail.hu  61b8a203438ea1c56c1489ec7bea7a0e

另一個文件是result.txt,其中1.txt中的所有行都包含2.txt中的匹配項。 但是在輸出文件中,匹配的第三列應替換為匹配的第二列(FS =':')

result.txt:

9871951 sexbollente@hotmail.com 1199
holliebrian nnagle1@yahoo.com 182:@*/
9075407 car_jacko@hotmail.fr 33;1:11
9837056 alainkp@gmail.com abcd123

我編寫了一個腳本來實現相同的任務:

awk -F : 'FNR==NR {s=$0;sub(/[^:]*:/, "", s); p[$1]=s; next} !($NF in p) {print > "left.txt"; next} {$NF=p[$NF]} 1' 2.txt FS=' ' OFS=' ' <(tr -d '\r' < 1.txt) > result.txt

我正在獲得預期的輸出,但是使用的是較大的文件1.txt(〜3GB)和2.txt(〜1 GB)。 腳本崩潰並出現以下錯誤:

awk:cmd。 行:1:(FILENAME = 2.txt FNR = 21085923)致命:/home/corinna/src/gawk/gawk-4.2.0/gawk-4.2.0-1.x86_64/src/gawk-4.2.0/node .c:1021:more_blocks:freep:無法分配9600字節的內存(無法分配內存)

請幫助我使腳本運行更大的文件。 任何幫助將不勝感激。 不必使用awk。 唯一的座右銘是在更短的時間內完成正確的工作而不會崩潰。

跟隨awk可能會幫助您。

awk '
FNR==NR{
  val=$1;
  sub(/[^:]*/,"");
  sub(/:/,"");
  a[val]=$0;
  next
}
!($NF in a){
  print > "left.txt";
  next
}
{
  print $1,$2,a[$NF]> "result.txt"
}
'  FS=":" 2.txt FS=" "  OFS=" " 1.txt

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM