最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Linux join命令快速實(shí)現(xiàn)從大文件中匹配內(nèi)容

 更新時(shí)間:2025年11月11日 14:49:03   作者:fengyehongWorld  
本文介紹了如何使用Linux命令和join命令進(jìn)行大數(shù)據(jù)文件的高效匹配,通過對(duì)文件進(jìn)行排序和使用join命令,可以顯著提升匹配效率,同時(shí),還討論了數(shù)據(jù)準(zhǔn)備、文件排序、join命令的應(yīng)用以及數(shù)據(jù)整理的方法

一. 作業(yè)背景

項(xiàng)目中,每個(gè)月都會(huì)收集當(dāng)月的用戶支付相關(guān)的信息,然后匯總到一個(gè)大csv文件中。

作業(yè)內(nèi)容需求:

  • 當(dāng)月的csv文件共有4000萬行數(shù)據(jù)
  • 客戶提供了一個(gè)有2萬行的文本文件,每一行對(duì)應(yīng)著一個(gè)用戶的id
  • 現(xiàn)在需要根據(jù)2萬個(gè)用戶id去大csv文件中進(jìn)行檢索,將匹配到的數(shù)據(jù)傳給客戶。

作業(yè)環(huán)境需求:

  • 大csv文件中存放在服務(wù)器上,因?yàn)楹锌蛻裘舾行畔?,只能連接到linux環(huán)境上作業(yè)
  • 只能使用linux命令來完成

遇到的問題

  • 普通匹配需要的話,直接使用grep命令進(jìn)行匹配即可
  • 如果需要多次匹配的話,可以寫若干個(gè)grep命令,然后放到一個(gè)bash腳本中批量執(zhí)行
  • 但是本次目標(biāo)文件數(shù)據(jù)量龐大,匹配源文件和待匹配的目標(biāo)文件數(shù)量龐大,通過grep命令的話,會(huì)消耗很多時(shí)間

解決方式

  • 通過join的方式進(jìn)行文件匹配可以極大提升匹配效率
  • 需要提前對(duì)文件進(jìn)行排序

二. 數(shù)據(jù)準(zhǔn)備

準(zhǔn)備40萬條數(shù)據(jù)

(
  echo "No,姓名,auid,地址"
  seq 1 400000 | awk 'BEGIN{OFS=","} {
      printf "%d,user_name_%09d,auid_%09d,地球%d\n", $1, $1, $1, $1
  }'
) > bigfile.csv

對(duì)生成的文件進(jìn)行二次處理,得到亂序的數(shù)據(jù)

  • shuf:對(duì)文件按照行進(jìn)行亂序處理,模擬真實(shí)的商用數(shù)據(jù)
  • sed -i '1i 要插入的內(nèi)容':向第一行插入數(shù)據(jù)
# 對(duì)文件進(jìn)行亂序處理
grep -v 姓名 bigfile.csv | shuf > shuffled.csv
# 為csv文件添加表頭
sed -i '1i No,姓名,auid,地址' shuffled.csv

獲取后1千條數(shù)據(jù),然后將auid數(shù)據(jù)輸出到一個(gè)文件中,模擬客戶提供的數(shù)據(jù)。

tail -n 1000 shuffled.csv | awk -F',' '{print $3}' > auid_list.txt

使用shuf命令隨機(jī)從auid_list.txt文件中獲取1行數(shù)據(jù),然后給除了第三個(gè)字段的所有字段的前后后添加一個(gè)@符號(hào)之后,追加到shuffled.csv中,目的是為了模擬有多個(gè)auid存在的情況。

  • shuf -n 1 auid_list.txt:從文件中隨機(jī)獲取一條數(shù)據(jù)
  • tee -a shuffled.csv
    • -a表示追加
    • 將數(shù)據(jù)打印到控制臺(tái)上的同時(shí),將數(shù)據(jù)追加到shuffled.csv
grep $(shuf -n 1 auid_list.txt) shuffled.csv | awk -F',' '{
    OFS = ","
    $1 = "@" $1 "@"
    $2 = "@" $2 "@"
    $4 = "@" $4 "@"
    print
}' | tee -a shuffled.csv
??? ???
@295178@,@user_name_000295178@,auid_000295178,@地球295178@
  • 可以看到一個(gè)auid對(duì)應(yīng)著2條數(shù)據(jù)
apluser@FengYeHong-HP:0724$ grep -a auid_000295178 shuffled.csv
295178,user_name_000295178,auid_000295178,地球295178
@295178@,@user_name_000295178@,auid_000295178,@地球295178@

三. 數(shù)據(jù)匹配

3.1 文件排序

sort -k<開始列>[,<結(jié)束列>] file:指定排序的字段范圍,也就是告訴 sort 從第幾列到第幾列作為排序依據(jù)。

  • sort -t, -k3,3
    • -t,:按照逗號(hào)進(jìn)行分隔
    • -k3,3:指定第3列作為排序依據(jù)
apluser@FengYeHong-HP:0724$ sort -t, -k3,3 shuffled.csv > all_info_sort.csv
apluser@FengYeHong-HP:0724$ tail all_info_sort.csv
399991,user_name_000399991,auid_000399991,地球399991
399992,user_name_000399992,auid_000399992,地球399992
399993,user_name_000399993,auid_000399993,地球399993
399994,user_name_000399994,auid_000399994,地球399994
399995,user_name_000399995,auid_000399995,地球399995
399996,user_name_000399996,auid_000399996,地球399996
399997,user_name_000399997,auid_000399997,地球399997
399998,user_name_000399998,auid_000399998,地球399998
399999,user_name_000399999,auid_000399999,地球399999
400000,user_name_000400000,auid_000400000,地球400000
apluser@FengYeHong-HP:0724$ sort auid_list.txt > auid_list_sort.csv
apluser@FengYeHong-HP:0724$ tail auid_list_sort.csv
auid_000395846
auid_000395932
auid_000395948
auid_000396121
auid_000396465
auid_000396566
auid_000397508
auid_000398221
auid_000398744
auid_000398933

3.2 join命令匹配數(shù)據(jù)

3.2.1 正常數(shù)據(jù)匹配

  • -t,:指定通過逗號(hào)分割文件
  • -1 1:指定第1個(gè)文件的第1個(gè)字段作為join條件
  • -2 3:指定第2個(gè)文件的第3個(gè)字段作為join條件
apluser@FengYeHong-HP:0724$ wc -l auid_list_sort.csv
1000 auid_list_sort.csv
apluser@FengYeHong-HP:0724$ join -t, -1 1 -2 3 auid_list_sort.csv all_info_sort.csv > result.csv
apluser@FengYeHong-HP:0724$ wc -l result.csv
1001 result.csv
apluser@FengYeHong-HP:0724$ grep -a auid_000295178 result.csv
auid_000295178,295178,user_name_000295178,地球295178
auid_000295178,@295178@,@user_name_000295178@,@地球295178@

3.2.2!!!注意事項(xiàng)!!!

兩個(gè)文件進(jìn)行join匹配數(shù)據(jù)的時(shí)候,第一個(gè)文件的換行符一定要是LF,不能是CRLF,否則無法join

  • 可以看到,我們將第一個(gè)文件的換行符轉(zhuǎn)換為CRLF之后,進(jìn)行join時(shí),無任何匹配
  • 在實(shí)際工作中,我們可能在windows環(huán)境中使用文本編輯器對(duì)第一個(gè)文件進(jìn)行編輯,手動(dòng)粘貼內(nèi)容,保存之后就直接帶到linux環(huán)境中使用了,大多數(shù)windows環(huán)境中的文本編輯器的換行符都是CRLF,因此會(huì)造成join命令無法匹配的情況。
apluser@FengYeHong-HP:0724$ nkf --guess auid_list_sort.csv
ASCII (LF)
apluser@FengYeHong-HP:0724$ awk '{printf "%s\r\n", $0}' auid_list_sort.csv > auid_list_CRLF_sort.csv
apluser@FengYeHong-HP:0724$
apluser@FengYeHong-HP:0724$ nkf --guess auid_list_CRLF_sort.csv
ASCII (CRLF)
apluser@FengYeHong-HP:0724$ nkf --guess all_info_sort.csv
UTF-8 (LF)
apluser@FengYeHong-HP:0724$ # ??????join之后, 無任何輸出??????
apluser@FengYeHong-HP:0724$ join -t, -1 1 -2 3 auid_list_CRLF_sort.csv all_info_sort.csv
apluser@FengYeHong-HP:0724$ # ??????join之后, 無任何輸出??????

四. 數(shù)據(jù)整理

通過join命令處理過之后的數(shù)據(jù),其指定用來join的字段會(huì)跑到第1列,破壞了原有的數(shù)據(jù)結(jié)構(gòu)

apluser@FengYeHong-HP:0724$ head result.csv
auid_000000333,333,user_name_000000333,地球333
auid_000000835,835,user_name_000000835,地球835
auid_000000922,922,user_name_000000922,地球922
auid_000001206,1206,user_name_000001206,地球1206
auid_000001436,1436,user_name_000001436,地球1436
auid_000001853,1853,user_name_000001853,地球1853
auid_000001925,1925,user_name_000001925,地球1925
auid_000002146,2146,user_name_000002146,地球2146
auid_000002195,2195,user_name_000002195,地球2195
auid_000002798,2798,user_name_000002798,地球2798

可通過awk命令將指定字段的順序進(jìn)行調(diào)換

awk -F',' '{
	col1 = $1;
	for(i=2; i<=3; i++) {
		printf "%s,", $i
	}
	printf "%s", col1
	for(i=4; i<=NF; i++) {
		printf ",%s", $i
	}
	printf "\n"
}' result.csv > result_handle.csv
  • 處理之后的效果
apluser@FengYeHong-HP:0724$ head result_handle.csv
333,user_name_000000333,auid_000000333,地球333
835,user_name_000000835,auid_000000835,地球835
922,user_name_000000922,auid_000000922,地球922
1206,user_name_000001206,auid_000001206,地球1206
1436,user_name_000001436,auid_000001436,地球1436
1853,user_name_000001853,auid_000001853,地球1853
1925,user_name_000001925,auid_000001925,地球1925
2146,user_name_000002146,auid_000002146,地球2146
2195,user_name_000002195,auid_000002195,地球2195
2798,user_name_000002798,auid_000002798,地球2798

五. 其他方式

除了join之外,awk命令也可以實(shí)現(xiàn)快速匹配的需求,只是效率沒有join那么高,不過一般也足夠用了。

  • 核心思想就是讀取源文件和待匹配的目標(biāo)文件
  • 將源文件中的數(shù)據(jù)放到數(shù)組中,然后指定待匹配的目標(biāo)文件的第3個(gè)字段是否在數(shù)組中
awk -F, 'NR==FNR{auid_list[$1]; next} $3 in auid_list' auid_list.txt shuffled.csv > result_handle_awk.csv
  • 通過diff命令可以看到生成的文件一致
apluser@FengYeHong-HP:0724$ diff <(sort result_handle_awk.csv) <(sort result_handle.csv)
apluser@FengYeHong-HP:0724$

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • MemcacheQ安裝及使用方法

    MemcacheQ安裝及使用方法

    MemcacheQ 是一個(gè)簡(jiǎn)單的分布式隊(duì)列服務(wù),它的運(yùn)行依賴于BerkeleyDB 和 libevent,所以需要先安裝BerkeleyDB和libevent,需要的朋友可以參考下
    2017-03-03
  • 一文詳解Linux下如何在vim里使用異步編譯和運(yùn)行

    一文詳解Linux下如何在vim里使用異步編譯和運(yùn)行

    這篇文章主要介紹了如何在Linux的vim編輯器中使用異步編譯和運(yùn)行C++程序,具體功能包括在vim中直接構(gòu)建和運(yùn)行單個(gè)文件或整個(gè)項(xiàng)目,使用快捷鍵如F9、F10、F7、F8和F6進(jìn)行操作,此外,提到了使用兩個(gè)vim插件來實(shí)現(xiàn)這些功能,并提供了必要的配置文件和命令信息
    2025-10-10
  • 解決navicat連接不上linux服務(wù)器上的mysql問題

    解決navicat連接不上linux服務(wù)器上的mysql問題

    這篇文章主要介紹了navicat連接不上linux服務(wù)器上的mysql的解決辦法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-10-10
  • Linux內(nèi)核啟動(dòng)流程詳解(基于 5.15.119 源碼)

    Linux內(nèi)核啟動(dòng)流程詳解(基于 5.15.119 源碼)

    文章詳細(xì)介紹了基于Linux 5.15.119源碼的x86_64架構(gòu)內(nèi)核啟動(dòng)流程,從GRUB加載bzImage到壓縮內(nèi)核解壓、初始化硬件、切換到保護(hù)模式、64位解壓入口,直至啟動(dòng)第一個(gè)用戶進(jìn)程/sbin/init的全過程,需要的朋友可以參考下
    2026-05-05
  • Xshell從會(huì)話同步到磁盤遷移的完整配置指南

    Xshell從會(huì)話同步到磁盤遷移的完整配置指南

    Xshell作為業(yè)界領(lǐng)先的SSH客戶端工具,以其強(qiáng)大的功能和穩(wěn)定性贏得了廣大技術(shù)人員的青睞,隨著使用時(shí)間的增長(zhǎng),我們會(huì)積累大量服務(wù)器連接配置,當(dāng)更換電腦或重裝系統(tǒng)時(shí),如何安全、完整地遷移這些配置成為一個(gè)實(shí)際問題,本文將為您提供一套完整的解決方案
    2025-12-12
  • Linux下進(jìn)程的CPU配置與線程綁定過程

    Linux下進(jìn)程的CPU配置與線程綁定過程

    本文介紹Linux系統(tǒng)中基于進(jìn)程和線程的CPU配置方法,通過taskset命令和pthread庫調(diào)整親和力,將進(jìn)程/線程綁定到特定CPU核心以優(yōu)化資源分配,提升系統(tǒng)性能與實(shí)時(shí)任務(wù)響應(yīng)效率,同時(shí)強(qiáng)調(diào)操作驗(yàn)證及注意事項(xiàng)
    2025-07-07
  • Linux下9種優(yōu)秀的代碼比對(duì)工具推薦小結(jié)

    Linux下9種優(yōu)秀的代碼比對(duì)工具推薦小結(jié)

    這篇文章主要介紹了Linux下9種優(yōu)秀的代碼比對(duì)工具推薦小結(jié),不僅有命令行工具,還有 GUI 界面工具,讓你輕松進(jìn)行代碼比對(duì),感興趣的可以一起來了解一下
    2020-06-06
  • Linux下如何尋找相同文件的方法

    Linux下如何尋找相同文件的方法

    這篇文章主要介紹了Linux下如何尋找相同文件的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-06-06
  • Linux中創(chuàng)建新用戶并賦予指定目錄的相關(guān)權(quán)限

    Linux中創(chuàng)建新用戶并賦予指定目錄的相關(guān)權(quán)限

    這篇文章主要介紹了Linux中創(chuàng)建新用戶并賦予指定目錄的相關(guān)權(quán)限,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2019-11-11
  • Linux基礎(chǔ)命令@grep、wc、管道符的使用詳解

    Linux基礎(chǔ)命令@grep、wc、管道符的使用詳解

    這篇文章主要介紹了Linux基礎(chǔ)命令@grep、wc、管道符的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2025-06-06

最新評(píng)論

大方县| 格尔木市| 普兰店市| 昌邑市| 湄潭县| 广饶县| 宝鸡市| 武川县| 宝山区| 广东省| 惠水县| 水富县| 盈江县| 和田市| 乌拉特后旗| 宜兰市| 沙坪坝区| 鲜城| 延长县| 沾益县| 鹿邑县| 阿城市| 宁蒗| 惠水县| 富锦市| 法库县| 庐江县| 伊宁市| 沾益县| 舟曲县| 栖霞市| 绍兴县| 夏河县| 格尔木市| 昭觉县| 通州市| 兖州市| 和田县| 大邑县| 宜春市| 沾化县|