如何从 bash 中的文件循环打印 2 列

Kal*_*Zen 3 bash awk loops while-loop do-while

我有以下内容,output.txt它只包含 2 列来演示:

Test1 Test1-IS-OK
Test2 Test2-IS-NOT
Test3 Test3-IS-OK
Test4 Test4-IS-OK
Test5 Test5-IS-NOT
Run Code Online (Sandbox Code Playgroud)

然后我的 bash 脚本有以下代码:

#!/bin/bash
output="output.txt"
a=$(awk '{ print $1 }' $output)
b=$(awk '{ print $2 }' $output)

while IFS=" " read -r $a $b
do
    echo "LOG: $a and $b"
done < "$output"
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

./test.sh: line 13: read: `Test1-IS-OK': not a valid identifier
Run Code Online (Sandbox Code Playgroud)

我需要有这样的输出

LOG: Test1 and Test1-IS-OK
LOG: Test2 and Test2-IS-NOT
LOG: Test3 and Test3-IS-OK
LOG: Test4 and Test4-IS-OK
LOG: Test5 and Test5-IS-NOT
Run Code Online (Sandbox Code Playgroud)

但是代码不起作用。从文件中循环这 2 列的最佳方法是什么?有没有更简单的方法?

anu*_*ava 7

最好是避免 bash 并在 awk 中完全做到这一点。在 awk 中,它很简单:

awk '{print "LOG:", $1, "and", $2}' file
Run Code Online (Sandbox Code Playgroud)
LOG: Test1 and Test1-IS-OK
LOG: Test2 and Test2-IS-NOT
LOG: Test3 and Test3-IS-OK
LOG: Test4 and Test4-IS-OK
LOG: Test5 and Test5-IS-NOT
Run Code Online (Sandbox Code Playgroud)

  • 这个答案实际上很容易出错,而且是一种不好的做法。[仔细阅读](https://unix.stackexchange.com/questions/169716/why-is-using-a-shell-loop-to-process-text-considered-bad-practice) (4认同)