2017-05-25 89 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