[英]How to print word get from variable in specific line with AWK?
我希望在第二行的“END”(或者也在文件的末尾)打印一个从变量中获取的特定单词。 拥有这两种方法将不胜感激。
我有一个包含以下内容的文件my_file.txt
:
#Insert the names separeted by space
l.lovre p.jhonson p.backer t.thompson q.ward
我试着正确编码:
#!/bin/bash
filename=/path/my_file.txt
read -p "Insert name: " name
#my attempt
awk -v myvar="$name" 'END{print myvar}' $filename
echo 'Name added'
但不起作用
我会得到这个结果:
我的文件.txt:
#Insert the names separeted by space
l.lovre p.jhonson p.backer t.thompson q.ward **name**
提前致谢
sed
更简单:
sed -i "$ s/$/ $name/" my_file.txt
编辑:确保文件中的最后一行不为空。
您可以使用$0 = $0 FS myvar
将它添加到文件中第 2 行的整行,并保留您的END
块以在所有行之后打印它,因为您也需要它。 如果您不想在所有行之后使用它,请删除END
块。
awk -v myvar="$name" 'FNR==2 {$0 = $0 FS myvar}1; END{print myvar}' $filename
Output name=Michele
:
#Insert the names separeted by space
l.lovre p.jhonson p.backer t.thompson q.ward Michele
Michele
默认情况下awk
不更新文件。 如果你想更新文件,你有几个选择:
######
# write to tmp file and then overwrite original file with tmp file
awk -v myvar="$name" 'END{print myvar}' "$filename" > tmpfile && mv tmpfile "$filename"
######
# if using 'GNU awk' you can use '-i inplace' to modify the file
awk -i inplace -v myvar="$name" 'END{print myvar}' "$filename"
至于将新名称附加到第二行末尾的问题,或者如果当前文件中没有名称则创建新行的问题:一个想法:
######
# writing to tmp file
awk -v myvar="$name" 'FNR==2 { print $0,myvar; added=1; next} 1; END { if (added!=1) print myvar}' "$filename" > tmpfile
mv tmpfile "$filename"
######
# using 'GNU awk'
awk -i inplace -v myvar="$name" 'FNR==2 { print $0,myvar; added=1; next} 1; ENDFILE { if (added!=1) print myvar}' "$filename"
笔记:
1
END {}
块处理发生在一个文件被处理之后; END {}
块生成的任何 output 都将 go 输出到标准输出GNU awk
,我们可以访问ENDFILE {}
块,这在本质上与END {}
块相同,只是这种情况下的处理适用于文件以GNU awk
解决方案进行试驾:
$ filename=names.dat
$ cat "$filename"
# Insert the names separeted by space
$ name='b.bunny'
$ awk -i inplace -v myvar="$name" 'FNR==2 { print $0,myvar; added=1; next} 1; ENDFILE { if (added!=1) print myvar}' "$filename"
$ cat "$filename"
# Insert the names separeted by space
b.bunny
$ name='d.duck'
$ awk -i inplace -v myvar="$name" 'FNR==2 { print $0,myvar; added=1; next} 1; ENDFILE { if (added!=1) print myvar}' "$filename"
$ cat "$filename"
# Insert the names separeted by space
b.bunny d.duck
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.