【问题标题】:How do I pipe a file line by line into multiple read variables?如何将文件逐行传输到多个读取变量中?
【发布时间】:2013-03-15 21:16:08
【问题描述】:

我有一个包含两列信息的文件:

box1 a1
box2 a2

我正在尝试将该文件逐行读入read,并将每个行项放入一个变量中。

在第一轮中,$a 将包含 box1$b 将包含 a1

在第二次传递中,$a 将包含 box2$b 将包含 a2,等等。

我尝试实现的代码示例如下:

for i in text.txt; do
    while read line; do
        echo $line | read a b;
    done < text.txt;
    echo $a $b;
done

这给了我以下结果:

box1 a1 box2 a2

当我预期以下结果时:

box1 a1
box2 a1

我该如何解决这个问题?

【问题讨论】:

    标签: bash


    【解决方案1】:

    输入read 命令会导致在子shell 中设置变量,这使得它们无法访问(实际上,它们已经消失)到您的其余代码中。不过,在这种情况下,您甚至不需要 for 循环或第二个 read 命令:

    while read -r a b; do
        echo "$a" "$b"
    done < text.txt
    

    【讨论】:

    • 宾果游戏!这就像一个魅力..谢谢你的解释,它为我解决了问题。 (@chepner 和 @Dave Jarvis.. 谢谢!)
    • 如果您可以读取` in your input, do not forget to use the -r` 参数。
    • @jfgagne,我研究了 -r 并在 oracle 文档中发现了以下内容 - “默认情况下,除非指定 -r 选项,否则反斜杠 (\) 充当转义字符。”这是你的意思吗?
    • @mlebel: 是的,你需要使用-r,因为如果你有一个像box1 foo\nbar 这样的输入行而没有-r 你会失去``。
    • @snapfractalpop:你是对的,文本被破坏了。原文是:如果你的输入可以有,不要忘记使用-r参数来读取 and 是的,你需要使用 -r,因为如果你有一个像 box1 foo&lt;backslash&gt;nbar 这样的输入行而没有 -r,你将失去 周围的反引号和 -r 用于格式化 cmets。这里的一般规则是,如果你使用read,你可能需要-r。有和没有-r,下面会给出不同的结果:echo "box1 foo&lt;backslash&gt;nbar" | { read -r txt; echo "$txt"; }
    【解决方案2】:

    另一种方法

    echo -e "one\ntwo\nthree" | {
    read -r a; 
    read -r b; 
    read -r c;
    echo "output of ($a, $b, $c)"
    }
    
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 2018-09-29
      • 2022-12-15
      相关资源
      最近更新 更多