繁体   English   中英

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

[英]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

也可以看看:
perldoc perlrun : 如何执行 Perl 解释器:命令行开关

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM