[英]How do I print 2 columns with looping from a file in bash
我有以下output.txt
它只包含 2 列来演示:
Test1 Test1-IS-OK
Test2 Test2-IS-NOT
Test3 Test3-IS-OK
Test4 Test4-IS-OK
Test5 Test5-IS-NOT
然后我的 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"
我收到以下错误:
./test.sh: line 13: read: `Test1-IS-OK': not a valid identifier
我需要有这样的输出
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
但是代码不起作用。 从文件中循环这 2 列的最佳方法是什么? 有没有更简单的方法?
最好是避免 bash 并在 awk 中完全做到这一点。 在 awk 中,它很简单:
awk '{print "LOG:", $1, "and", $2}' file
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
请考虑将awk
解析转移到它所属的循环:
#!/bin/bash
output="output.txt"
while read -r line
do
a=$(echo "${line}" | awk '{print $1}')
b=$(echo "${line}" | awk '{print $2}')
echo "LOG: $a and $b"
done < "$output"
根据@EdMorton 的好建议进行编辑
你的代码有什么问题?
a=$(awk '{ print $1 }' $output)
使用echo "a=${a}"
你会看到, a 填充了所有行的输出。 你试图找到一些函数,在$a
之后调用。
while IFS=" " read -r $a $b
现在您正在尝试调用“函数”a 和 b。 代码将在读取输入文件之前替换变量的值。 当 a 用“Test1 Test2”填充时,代码将尝试填充字段$Test1
和$Test2
。
当您只想更改输出而不将变量传递给另一个语句时,您可以使用awk
,或者
sed -E 's/([^ ]*) ([^ ]*).*/LOG: \1 and \2/' $output
# or
printf 'LOG: %s and %s\n' $(<$output)
你的情况,你可以read
读书两个参数:
while read -r a b
do
echo "LOG: $a and $b"
done < "$output"
使用这个 Perl 单行:
perl -lane 'print "LOG: $F[0] and $F[1]";' output.txt > new.txt
Perl 单行使用这些命令行标志:
-e
:告诉 Perl 查找内嵌代码,而不是在文件中。
-n
:一次循环输入一行,默认情况下将其分配给$_
。
-l
:在执行内联代码之前去除输入行分隔符(默认情况下 *NIX 上的"\\n"
),并在打印时附加它。
-a
:在空格或-F
选项中指定的正则表达式上将$_
拆分为数组@F
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.