亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
12下一頁
最近訪問板塊 發(fā)新帖
查看: 5859 | 回復: 11
打印 上一主題 下一主題

跨文件關鍵字匹配--方法總結 [復制鏈接]

論壇徽章:
0
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2012-06-03 12:48 |只看該作者 |倒序瀏覽

近段時間碰到了很多情況是需要跨兩個輸入文件,通過關鍵字來將相同內(nèi)容合并,于是在此區(qū)分不同情況,將解決辦法總結如下:
          希望能幫助其他跟我一樣有過困惑的朋友。。
   解決方法有很多,這里只是提出其中一部分,供大家討論,提出意見,或者還有怎樣情況的匹配條件需要另外注意   ??  

解決方法中,表明了每一個提供答案的貢獻者,再次感謝他們

第一種情況:匹配條件的關鍵字在兩個文件中都是唯一,不重復的
按照某一列的內(nèi)容,合并相同內(nèi)容的兩個文件中的行,均已制表符進行劃分的

如文件1:(此文件中第三列為關鍵字)
  1. Qwe        wer        aa        rty
  2. Giy        rug        cc        uop
  3. Rtu        egj        ee        ioj
  4. Drt        tue        ff        yti
復制代碼
文件2::(而此文件中第二列為關鍵字)
  1. 123        aa        wyf        yui
  2. 234        bb        yoi        dty
  3. 456        dd        uoj        yio
  4. 567        ee        drt        hio
復制代碼
分別得到三個結果:
    結果文件一:  在兩個文件中有匹配的記錄
  1. Qwe        wer        aa        rty        123        aa        wyf        yui
  2. Rtu        egi        ee        ioj        567        ee        drt        hio
復制代碼
結果文件二:   只在輸入文件一中存在的記錄
  1. Giy        rug        cc        uop
  2. Drt        tue        ff        yti
復制代碼
結果文件三:   只在輸入文件二中存在的記錄
  1. 234        bb        yoi        dty
  2. 456        dd        uoj        yio
復制代碼
解決方法:
1.由“yinyuemi ”提供
  1. $ join -1 3 -2 2 file1 file2 # comm
  2. $ grep -vf <(cut -f3 file1) file2 # file2 only
  3. $ grep -vf <(cut -f2 file2) file1 # file1 only
復制代碼
2.由“yangkyo821 ”提供
  1. $ awk 'NR==FNR{f1[$3]=$0;next}$2 in f1{printf $0"\t"f1[$2] RS > "outfile1";delete f1[$2];next}{print > "outfile3"}END{for(s in f1)print f1[s] > "outfile2"}' file1 file2
復制代碼
3.由“jiejie455”提供
  1. $ awk 'NR==FNR{a[$3]=$0;ind[$3]};NR>FNR{b[$2]=$0;ind[$2]}END{for(i in ind){if(a[i]&&b[i]){print a[i],b[i]}}}' file1 file2 ##comm
  2. $ awk 'NR==FNR{a[$3]=$0;ind[$3]};NR>FNR{b[$2]=$0;ind[$2]}END{for(i in ind){if(a[i]&&!b[i]){print a[i],b[i]}}}' file1 file2 ##file1_only
  3. $ awk 'NR==FNR{a[$3]=$0;ind[$3]};NR>FNR{b[$2]=$0;ind[$2]}END{for(i in ind){if(!a[i]&&b[i]){print a[i],b[i]}}}' file1 file2 ## file2_only
復制代碼
第二種情況:需要同時匹配兩列的關鍵字,而且第二列,第三列之間在同一個輸入文件中是存在重復記錄的
文件一的第二列必須匹配文件二的第三列(file_1$2==file_2$3),而同時文件一的第三列必須匹配文件二的第四列(file_1$3==file_2$4)。

輸入文件一:

  1. 11        aa        bb        123        456
  2. 22        aa        cc        456        789
  3. 33        ee        bb        123        789
  4. 44        bb        aa        456        132
復制代碼
輸入文件二:
  1. +        1        aa        cc
  2. +        2        ee        bb
復制代碼
希望輸出的結果文件是:

  1. 22        aa        cc        456        789        +        1        aa        cc
  2. 33        ee        bb        123        789        +        2        ee        bb
復制代碼
解決方法:
1.由"rdcwayx "提供
  1. $ awk 'NR==FNR{a[$2 FS $3]=$0;next}$3 FS $4 in a {print a[$3 FS $4] "\t"  $0}' file1 file2
復制代碼
2.由“zhaopingzi ”提供
  1. $ awk 'ARGIND==1 {a[$2$3]=$0} ARGIND>1&&($3$4 in a) {print a[$3$4],$0}' file1 file2
復制代碼
第三種情況:匹配關鍵字的列在其中一個輸入文件中含有重復的記錄,匹配全部的記錄

輸入文件fileA,此時第三列中就出現(xiàn)有重復的“aa”
  1. 11        123        aa        321
  2. 12        223        aa        123
  3. 22         332        bb        231
復制代碼
輸入文件fileB
  1. aa        AA
  2. bb        BB
復制代碼
根據(jù)文件一中的第三列和文件二中的第一列進行匹配,匹配成功的合并一個文件輸出
希望的結果文件result
  1. 11        123        aa        321        aa        AA
  2. 12        223        aa        123        aa        AA
  3. 22         332        bb        231        bb        BB
復制代碼
解決方法:
1.由“winway1988 ”提供
  1. $ awk 'NR==FNR{a[$1]=$0}NR>FNR{print $0 "\t" a[$3]}' fileB fileA
復制代碼
2.由“zooyo ”提供
  1. $ awk 'BEGIN{while(getline <"fileB")a[$1]=$0}{$0=$0"\t"a[$3]}1' fileA  
復制代碼
第四種情況:當兩個不同文件中存在關鍵字需要匹配,且需要匹配的關鍵字,在兩個輸入文件中均存在重復的記錄
輸入文件一:此時第二列中"aa bb"均出現(xiàn)重復
  1. 1        aa        123
  2. 2        aa        234
  3. 3        bb        345
  4. 4        bb        445
  5. 5        dd        234
復制代碼
輸入文件二:此時第三列的"bb"仍然出現(xiàn)有重復
  1. A1        111        aa
  2. B1        222        bb
  3. B2        333        bb
  4. B2        333        cc
復制代碼
根據(jù)輸入文件一中第2列,輸入文件二中第3列作為關鍵字進行匹配,輸出全部匹配的記錄
期望輸出結果:
  1. 1        aa        123        A1        111        aa
  2. 2        aa        234        A1        111        aa
  3. 3        bb        345        B1        222        bb
  4. 4        bb        445        B1        222        bb
  5. 3        bb        345        B2        333        bb
  6. 4        bb        445        B2        333        bb
復制代碼
解決方法:
1.由“rdcwayx ”提供
  1. $ awk 'NR==FNR{key[$2]++;a[$2 FS key[$2]]=$0;next} $3 in key {for (i=1;i<=key[$3];i++) print a[$3 FS i], $0}' OFS="\t"  file1.txt file2.txt
復制代碼
2.由“jiejie455”提供
  1. awk 'NR==FNR{a[$2]=a[$2]?$0"|"a[$2]:$0};NR>FNR{if(a[$3]){split(a[$3],b,"|");for(i=1;i<=length(b);i++){print b[i]"\t"$0}}}' file1 file2
復制代碼

論壇徽章:
0
2 [報告]
發(fā)表于 2012-06-03 15:31 |只看該作者
學習學習!

論壇徽章:
3
2015年辭舊歲徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:51:162015年亞洲杯之阿曼
日期:2015-04-07 20:00:59
3 [報告]
發(fā)表于 2012-06-03 15:45 |只看該作者
提示: 作者被禁止或刪除 內(nèi)容自動屏蔽

論壇徽章:
0
4 [報告]
發(fā)表于 2012-06-10 14:46 |只看該作者
頂啊   很好很強大  智慧的結晶

論壇徽章:
1
摩羯座
日期:2014-12-29 15:59:36
5 [報告]
發(fā)表于 2012-06-10 17:33 |只看該作者
牛,好好學習了

論壇徽章:
13
15-16賽季CBA聯(lián)賽之同曦
日期:2016-01-28 19:52:032015亞冠之北京國安
日期:2015-10-07 14:28:19NBA常規(guī)賽紀念章
日期:2015-05-04 22:32:03處女座
日期:2015-01-15 19:45:44卯兔
日期:2014-10-28 16:17:14白羊座
日期:2014-05-24 15:10:46寅虎
日期:2014-05-10 09:50:35白羊座
日期:2014-03-12 20:52:17午馬
日期:2014-03-01 08:37:27射手座
日期:2014-02-19 19:26:54子鼠
日期:2013-11-30 09:03:56獅子座
日期:2013-09-08 08:37:52
6 [報告]
發(fā)表于 2012-06-27 10:18 |只看該作者
總結的真及時,贊! ^_^

論壇徽章:
0
7 [報告]
發(fā)表于 2012-06-27 12:13 |只看該作者
第三種匹配是不是有些問題:
樓主給的a,b2個文件正好是都有匹配,如果a文件多一條記錄,比如
33        121        ee        121
那這條記錄應該是不被顯示出來的,因為b文件無匹配.

修改如下:
awk 'NR==FNR{a[$1]=$0}NR>FNR&&a[$3]{print $0 "\t" a[$3]}' 2.txt 1.txt
awk 'BEGIN{while(getline <"fileB")a[$1]=$0}{$0=$0"\t"a[$3]}a[$3]' fileA  

論壇徽章:
33
ChinaUnix元老
日期:2015-02-02 08:55:39CU十四周年紀念徽章
日期:2019-08-20 08:30:3720周年集字徽章-周	
日期:2020-10-28 14:13:3020周年集字徽章-20	
日期:2020-10-28 14:04:3019周年集字徽章-CU
日期:2019-09-08 23:26:2519周年集字徽章-19
日期:2019-08-27 13:31:262016科比退役紀念章
日期:2022-04-24 14:33:24
8 [報告]
發(fā)表于 2012-06-27 13:45 |只看該作者
有總結才有進步,加油。

求職 : 項目經(jīng)理
論壇徽章:
22
獅子座
日期:2014-01-14 08:42:1615-16賽季CBA聯(lián)賽之八一
日期:2016-12-15 16:11:1315-16賽季CBA聯(lián)賽之佛山
日期:2016-12-19 08:58:1315-16賽季CBA聯(lián)賽之佛山
日期:2017-01-12 11:34:1415-16賽季CBA聯(lián)賽之福建
日期:2017-02-22 14:05:4415-16賽季CBA聯(lián)賽之福建
日期:2017-06-09 08:59:4015-16賽季CBA聯(lián)賽之深圳
日期:2017-07-17 11:19:3615-16賽季CBA聯(lián)賽之新疆
日期:2018-03-09 09:36:5115-16賽季CBA聯(lián)賽之江蘇
日期:2018-07-18 10:44:4615-16賽季CBA聯(lián)賽之山西
日期:2018-09-19 09:09:2615-16賽季CBA聯(lián)賽之浙江
日期:2016-11-18 15:14:1615-16賽季CBA聯(lián)賽之四川
日期:2016-06-27 11:43:31
9 [報告]
發(fā)表于 2012-06-27 15:16 |只看該作者
都是大牛。。。

論壇徽章:
0
10 [報告]
發(fā)表于 2012-07-12 15:33 |只看該作者
先記下來,或許以后有用
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP