2017-05-25 87 views
1

所以我在寫一個bash腳本從文本文件中按字母順序列表名稱,但只能用相同的頻率(在第二列定義)管道AWK輸出到grep的

grep -wi '$1' /usr/local/linuxgym-data/census/femalenames.txt | 
awk '{ print ($2) }' | 
grep '$1' /usr/local/linuxgym-data/census/femalenames.txt | 
sort | 
awk '{ print ($1) }' 

由於我的名字做這節課,我一直在考慮輸入「ANA」的例子,應該返回

ANA 

RENEE 

而且文檔有大約4500行它

但是這兩個領域我在看有

ANA   0.120  55.989 181 

RENEE   0.120  56.109 182 

所以我想找到第二列與全日空(0.120)相同的所有名稱。第二欄是名字的頻率......這只是我學校給我的虛擬數據,所以我不知道這是什麼意思。 但是,如果有與ANA(0.120)相同頻率的另一個名稱,它也會列在輸出中。

當我自己運行這些命令時,它們可以很好地工作,但它似乎在使用awk輸出作爲$ 1的第3行時遇到問題,它在它下面的grep中。

我對此很新,所以我很可能以最迂迴的方式做到這一點。

+3

向我們展示您的輸入文件並向我們展示您期望從中獲得什麼,而不是說明爲什麼您的代碼無法工作! – Inian

+0

好點 好,因爲我做這個班,我一直在考慮輸入「ANA」的例子,應該返回 ANA RENEE 和文檔具有約4500行它 但我正在查看的兩個域分別爲 ANA 0.120 55.989 181和下一行 RENEE 0.120 56.109 182 – Astrobama

+1

更新有問題的輸入文件和註釋部分中的_not_ – Inian

回答

0

採用單AWK

inp="ANA" 
awk -v inp=$inp '{ a[$1]=$2 } END { if(inp in a){ v=a[inp]; 
     for(i in a){ if(a[i]==v) print i }} 
}' /usr/local/linuxgym-data/census/femalenames.txt | sort 

輸出:

ANA 
RENEE 

  • a[$1]=$2 - 每個

  • if(inp in a){ v=a[inp];累積頻率值 - 如果輸入名稱inp是陣列 - 獲取其頻率

  • for(i in a){ if(a[i]==v) print i - 打印所有具有相同的頻率值作爲輸入

+0

工作很好 我剛剛將inp =「ANA」更改爲inp =「$ 1」 並將「| sort」添加到最後一行的末尾 – Astrobama

+0

@Astrobama,好的,我在末尾添加了'sort' – RomanPerekhrest

+0

爲什麼你不只是比較'a [inp]'而不是創建'v'。 – 123

0

這也許應該這樣做...

f="/usr/local/linuxgym-data/census/femalenames.txt" 
grep $(grep -wi -m 1 "$1" $f | awk '{ print ($2) }') $f | \ 
    sort | awk '{ print ($1) }' 

測試...

echo 'ANA   0.120  55.989 181 
RENEE   0.120  56.109 182' > fem 
foo() { grep $(grep -wi -m 1 "$1" $f | awk '{ print ($2) }') $f | \ 
     sort | awk '{ print ($1) }' ; } 
f=fem ; foo ANA 

輸出:

ANA 
RENEE 
1

你也許可以做到這一點的一個線,但這是推動了一下。將它分成兩部分,以便於寫/讀。例如:這和RomanPerekhrest的解決方案之間

name=$1 
src=/usr/local/linuxgym-data/census/femalenames.txt 

# get the frequency you're after 
freq=$(awk -v name="$name" '$1==name {print $2}' "$src") 

# get the names with that frequency 
awk -v freq="$freq" '$2==freq {print $1}' "$src" 

權衡的是,他們的解決方案會做一個掃描,但在內存中所有內容建立索引。這將掃描文件兩次,但保存你的內存。

+0

通過字符串插值傳遞給awk shell變量是一個壞主意,使用'awk語法-v avar =「$ svar」...' – user000001

+0

@ user000001你是對的,已更新 – viraptor