繁体   English   中英

如何打印 word get from variable in specific line with AWK?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM