$ 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美元中找到什么?我认为理解这将有助于我避免许多脚本问题。
答案 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循环。