所以我正在编写一个 bash 脚本来按字母顺序列出文本文件中的名称,但只列出具有相同频率的名称(在第二列中定义)
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
所以我想找到第二列与 ANA (0.120) 相同的所有名称。第二列是名字出现的频率……这只是我学校给我的虚拟数据,所以我不知道那是什么意思。 但是,如果有另一个名称与 ANA (0.120) 具有相同的频率,它也会在输出中列出。
当我自己运行这些命令时,它们运行良好,但在它下面的 grep 中使用 awk 输出作为 $1 的第 3 行似乎有问题。
我对此很陌生,所以我很可能以最迂回的方式来做。
最佳答案
您可能可以在一行中完成此操作,但这有点费力。将它分成两部分,以便于编写/阅读。例如:
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"
此解决方案与 RomanPerekhrest 的解决方案之间的权衡是,他们的解决方案将执行一次扫描,但索引内存中的所有内容。这将扫描文件两次,但可以节省内存。
关于linux - 将 awk 输出通过管道传输到 grep,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44174107/