读取行中awk的行为

时间:2013-11-20 18:47:21

标签: bash awk

 $ cat file
 11 asasaw121
 12 saasks122
 13 sasjaks22

 $ cat no
 while read line
 do
 var=$(awk '{print $1}' $line)
 echo $var
 done<file

 $ cat yes
 while read line
 do
 var=$(echo $line | awk '{print $1}')
 echo $var
 done<file

 $ sh no
 awk: can't open file 11
 source line number 1

 awk: can't open file 12
 source line number 1

 awk: can't open file 13
 source line number 1

 $ sh yes
 11
 12
 13

为什么第一个不起作用? awk期望在1美元中找到什么?我认为理解这将有助于我避免许多脚本问题。

4 个答案:

答案 0 :(得分:3)

awk始终需要文件名作为输入

在下面,$line是字符串而不是文件。

 var=$(awk '{print $1}' $line)

你可以说(注意变量附近的双引号)

 var=$(awk '{print $1}' <<<"$line")

答案 1 :(得分:2)

  

Why doesn't the first one work?

由于这一行:

var=$(awk '{print $1}' $line)

假设$line是一个文件。

你可以成功:

var=$(echo "$line" | awk '{print $1}')

OR

var=$(awk '{print $1}' <<< "$line")

答案 2 :(得分:1)

awk '{print $1}' $line
                 ^^ awk expects to see a file path or list of file paths here
                    what it is getting from you is the actual file line

您要做的就是像第二个示例中那样将行传入awk

答案 3 :(得分:1)

你得到了具体问题的答案,但我不确定你是否真的从未真正做过上述任何一项。

要从文件中打印第一个字段,您可以执行以下操作:

while IFS= read -r first rest
do
    printf "%s\n" "$first"

done < file

或者这个:

awk '{print $1}' file

或者这个:

cut -d ' ' -f1 <file

不建议使用shell循环。

相关问题