Bash:如果文件存在,请读取行,执行此操作*然后*比,然后继续下一行

时间:2013-06-03 15:25:15

标签: bash awk

直截了当:我需要执行以下操作(伪代码):

if [ -f <file_that_exists> ]

then

while read
do


awk '{print "do stuff for " $1}' THEN immediately below it awk '{print "do stuff for" $2}'
Then continue to next line

我正在尝试解析的文件有两列(如果你愿意的话,还有主机对):

host_1     host_2
host_3     host_4

我需要输出的内容如下:

Do stuff for host_1
Do stuff for host_2
Do stuff for host_3
Do stuff for host_4    

我现在正在尝试的是:

Do stuff for host_1
Do stuff for host_3
Do stuff for host_5
Do stuff for host_7
then
Do stuff for host_2
Do stuff for host_4
Do stuff for host_6
Do stuff for host_8

我不确定自己是否非常清楚,所以如果您需要进一步澄清,请告诉我。

谢谢!

2 个答案:

答案 0 :(得分:3)

我相信你的目标可以在一个awk声明中完成:

awk '{ print "Do stuff for " $1; print "Do stuff for " $2 }' filename

或者:

awk '{ printf "Do stuff for %s\nDo stuff for %s\n", $1, $2 }' filename

无需使用shell从文件中读取;只需将文件名直接传递给awk即可。上述解决方案的关键是awk将从文件中读取,逐个记录(此处:逐行),并将该行中的每个字段(此处:host_1,host_2等)编码为1美元和2美元。如果每行中有可变数量的字段,解决方案会有所不同(可能涉及awk内的循环),但上面的情况很简单。

答案 1 :(得分:0)

在这种情况下,您希望使用for循环迭代文件中的单词

for host in $(< filename); then
    Do something with $host
done

或者,从每行读取2个单词

while read host_a host_b; do
    Do something with $host_a
    Do something with $host_b
done < filename