天天看點

Hadoop工程師面試題:使用linux指令完成文本處理

某個目錄下有兩個檔案a.txt和b.txt,檔案格式為(ip,username),

列如:

a.txt

127.0.0.1 zhangsan

127.0.0.1 wangxiaoer

127.0.0.2 lisi

127.0.0.3 wangwu

b.txt

127.0.0.4 lixiaolu

127.0.0.1 lisi

每個檔案至少100萬行,請使用Linux指令完成如下工作:

1)每個檔案各自的ip數

2)出現在b.txt而沒有出現在a.txt的ip

3)每個user出現的次數以及每個user對應的ip數

答:1)

cat a.txt | awk -F" " '{print $1}' | sort -u > ipa.txt

wc -l ipa.txt

cat b.txt | awk -F" " '{print $1}' | sort -u > ipb.txt

wc -l ipb.txt

2)

diff ipa.txt ipb.txt | grep \> | awk -F" " '{print $2}'

3)

cat a.txt b.txt | awk -F" " '{u[$1" "$2]+=1} END{for(i in u) print i,u[i]}' | awk -F" " '{u[$2]+=$3;ip[$2]+=1} END{for(i in u) print i,u[i],ip[i]}'

用到linux指令介紹:

1\awk

awk -F” ” ‘BEGIN{} {} END{}’

如: cat a.txt | awk -F” ” ‘{u[$1]+=1} END{for(i in u) print i,u[i]}’

注: 1)-F” ” : F表示分隔符,其後緊跟分隔符,用雙引号括起來,不指定分隔符預設使用空格分隔

2)單引号中的語句-‘BEGIN{} {} END{}’可分成三部分:

BEGIN表示{}之前執行的語句,且隻執行一次;

{}中的語句對于檔案中的每一行執行一次;

END表示所有{}執行結束之後才執行一次的語句.

2\grep

grep str file : 從file中查找所有含有str串的行,并傳回該行内容

grep -r update /etc/acpi : 查找指定目錄/etc/acpi 及其子目錄(如果存在子目錄的話)下所有檔案中包含字元串”update”的檔案,并列印出該字元串所在行的内容

3\豎線’|’表示管道,前面指令的輸出作為後面語句的輸入

4\sort

sort file : 對file内容按遞增排序(不去重),但并不修改源檔案

sort -r file : 對file内容按遞減排序(不去重),不改源檔案

sort -u file > newfile: 對file内容進行排序(去重),但并不修改源檔案,而是輸入newfile中

5\‘>’

‘>’file : 表示輸出至file内

若要表示字元大于号’>’,使用\>轉義.

6\wc

wc -l(–lines) file : 統計檔案有多少行

wc -c(–chars,–bytes) file : 統計檔案含有多少個位元組

7\diff

diff filea fileb

注:1)若filea\fileb都有序,則該指令可以錯位對齊; 2)若有一個無序,則嚴格按行比對;

設ipa.txt中内容為:有序

127.0.0.1

127.0.0.2

127.0.0.3

設ipb.txt中内容為:有序

127.0.0.1

127.0.0.3

127.0.0.4

diff ipa.txt ipb.txt -y -W 50 (錯位對齊)

127.0.0.1 127.0.0.1

127.0.0.2 <

127.0.0.3 127.0.0.3

> 127.0.0.4

再使用grep \> 即可取出ipb中有而ipa中沒有的ip

繼續閱讀