在Bash函数中优化多线管到awk

时间:2018-02-01 10:42:27

标签: 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}'    

但换行符丢失,它将所有标准输出列表视为一行。

重要提示:我需要在输入中输入管道,因为一般情况下我不需要输入文件。假设文件是​​多行的,问题实际上就是这个问题。我知道我可以使用“awk something filename”但这对我没用。

4 个答案:

答案 0 :(得分:4)

丢失while。 Awk本身就是一个循环:

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

答案 1 :(得分:3)

无需使用while循环,然后使用awkawk本身可以读取输入文件。其中$1是传递给您脚本的参数。

cat script.ksh
awk -v field="$1" '{print $field}' Input_file

./script.ksh 1

答案 2 :(得分:3)

使用stdinfile

field_get() {
  awk -F ';' -v number="$1" '{print $number}' "${2:-/dev/stdin}"
}

测试结果:

$ field_get() {
   awk -F ';' -v number="$1" '{print $number}' "${2:-/dev/stdin}"
}

$ echo '1;2;3;4' >testfile

$ field_get 3 testfile 
3

$ echo '1;2;3;4' | field_get 2
2

答案 3 :(得分:1)

这是cut命令的作业:

cut -d';' -f1 somefile