使用bash,通过ifs分隔行并打印整行

3
awk 使用分隔符将一行分成字段时,它将原始行保留在 $0 变量中。因此,在对单个字段执行操作后,它可以打印原始行(假设没有其他内容修改 $0)。那么 bash 的 read 是否可以实现类似的功能,既包括单个元素又包括整行?
例如,对于以下的 input.txt
foo,bar
baz,quz

我正在尝试在Bash中模仿的awk行为是: awk -F, '($1 == "baz") {print $0}' input.txt

这将打印出baz,quz,因为$0是读取的整行,即使该行也被分成了两个字段($1$2)。

Bash:

while IFS=, read -r first second; do
   if [[ "$first" == lemur ]]; then
      # echo the entire line
   fi
done < input.txt

在这种简单的情况下,通过在$first$second变量之间加上逗号来回显,重新创建原始行不会太困难。但是,在更复杂的场景中,IFS可能超过一个字符,并且可能有许多字段,除非bash在读取操作期间维护它,否则准确地重新创建原始行将变得更加困难。
1个回答

5

可能你需要用两个不同的read来完成,就像这样:

while read -r line; do
    IFS=, read first second <<<"$line"

    if [[ $first == lemur ]]; then
        printf '%s\n' "$line"
    fi
done < input.txt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接