awk在变量中的用法

时间:2014-09-21 18:42:52

标签: linux bash awk

actlist文件包含大约15条记录。我想在变量中打印/存储每一行​​以执行进一步的操作。脚本运行但echo $ j显示空白值。有什么问题? 我的剧本:

#/usr/bin/sh

acList=/root/john/actlist

Rowcount=`wc -l $acList | awk -F " " '{print $1}'`

for ((i=1; i<=Rowcount; i++)); do

j=`awk 'FNR == $i{print}' $acList`

echo $j
done

file:actlist

cat > actlist

5663233332 2223 2
5656556655 5545 5
4454222121 5555 5
.
.
.

3 个答案:

答案 0 :(得分:0)

问题恰好与引号和shell插入变量的方式有关。

更具体地说,当你写

j=`awk "FNR == $i{print}" $acList`

AWK代码必须包含在双引号中。如果您希望shell能够将$i替换为i变量中存储的实际值,则必须执行此操作。

另一方面,如果你写

j=`awk 'FNR == $i{print}' $acList`

即。使用单引号$i将被解释为文字字符串。

因此固定代码将为:

#/usr/bin/sh

acList=/root/john/actlist

Rowcount=`wc -l $acList | awk -F " " '{print $1}'`

for ((i=1; i<=Rowcount; i++)); do

    j=`awk "FNR == $i{print}" $acList`

    echo $j
done

记住:在调用其他命令之前,它始终是shell进行变量插值。

话虽如此,在提供的代码中有一些地方可以设计出一些改进。但这是另一个故事。

答案 1 :(得分:0)

我认为你可能会更好地解析你的文件:

#!/bin/bash
while read a b c; do
   echo $a, $b, $c
done < "$actlist"

<强>输出:

5663233332, 2223, 2
5656556655, 5545, 5
4454222121, 5555, 5

<强>更新

虽然上面演示了我建议的概念,正如@EdMorton在评论部分正确地说的那样,以下代码对于生产环境来说会更加健壮。

#!/bin/bash
while IFS= read -r a b c; do
   echo "$a, $b, $c"
done < "$actlist"

答案 2 :(得分:0)

不幸的是,你的所有脚本都打印输入文件的内容,所以我们无法帮助你找到正确的方法去做你真正想做的事情而没有关于那是什么的更多信息但机会是这是正确的起点:

acList=/root/john/actlist
awk '
{ print }
' "$acList"