我有这个功能:
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”但这对我没用。
答案 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
循环,然后使用awk
。 awk
本身可以读取输入文件。其中$1
是传递给您脚本的参数。
cat script.ksh
awk -v field="$1" '{print $field}' Input_file
./script.ksh 1
答案 2 :(得分:3)
使用stdin
或file
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