linux - 在 Bash 函数中优化多行管道到 Awk

标签 linux bash awk

我有这个功能:

field_get() {
  while read data; do
    echo $data | awk -F ';' -v number=$1 '{print $number}'
  done
}

可以这样使用:

cat filename | field_get 1

为了从一些管道输入中提取第一个字段。这行得通,但我在每一行上迭代,它比预期的要慢。

有人知道如何避免这种迭代吗?

我尝试使用:

stdin=$(cat)
echo $stdin | awk -F ';' -v number=$1 '{print $number}'    

但是换行符丢失了,它将所有标准输入视为一行。

重要提示:我需要通过管道输入,因为通常我不必只 cat 一个文件。假设文件是​​多行的,问题实际上是这样的。我知道我可以使用“awk something filename”,但这对我没有帮助。

最佳答案

只是丢掉 while。 awk 本身就是一个 while 循环:

field_get() {
  awk -F ';' -v number=$1 '{print $number}'
}
$ echo 1\;2\;3 | field_get 2
2

更新:

不确定您对多行管道和文件的评论是什么意思,但是:

$ cat foo
1;2
3;4
$ cat foo | field_get 1
1
3

关于linux - 在 Bash 函数中优化多行管道到 Awk,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48560802/

相关文章:

bash - ssh bash脚本没有这样的文件或目录

regex - SED/AWK 多文件替换?

linux - 我们在使用套接字时应该处理什么错误

python - Python如何在远程机器上执行命令并等待执行完成?

带有大量单引号和双引号的命令的 Bash 脚本

bash - 如何阻止 VI 重叠和隐藏命令行输出的最后一页?

linux - 通过 ssh 运行持久化进程

linux - 为什么 PostgreSQL 的 shell 显示不同的操作系统版本而不是我的真实操作系统?

linux - 如何使用 Linux/Unix 实用程序提取每个输入行开头的整数或小数?

bash - 如何为以 string1 开头但不以 string2 结尾的行着色