linux - 将 awk 输出通过管道传输到 grep

标签 linux bash awk grep

所以我正在编写一个 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/

相关文章:

linux - 如何用 git 组织单树?

linux - 无法将基于熔断器的卷公开给 Docker 容器

linux - 无法通过 ssh 成功声明 -f

string - 合并两个非常大的文件,忽略第一句

regex - 每行一个输出组,带有组名和组 ID

windows - 大文件的大量文件句柄 - 潜在问题?

c++ - 如何在 Qt 的 qgraphicsrectitem 中制作自动收报机

Bash:如何通过插入连续字符和换行符来查找和拆分长行?

linux - 导出带有特殊字符的 .env

bash - awk 动态文档索引