linux 如何用AWK打印从特定行的变量中获取的字?

carvr3hs  于 2023-01-12  发布在  Linux
关注(0)|答案(3)|浏览(142)

我希望打印在“结束”的第二行(或也在结束文件)一个特定的字从一个变量。这将是赞赏有两个方法。
我有一个包含以下内容的文件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**

先谢了

uttx8gqw

uttx8gqw1#

sed比较简单:

sed -i "$ s/$/ $name/" my_file.txt

编辑:确保文件中的最后一行不为空。

sczxawaw

sczxawaw2#

你可以把它添加到$0 = $0 FS myvar文件的第2行的整行中,并且保留你的END块以便在所有行之后打印它,因为你也想要这样做。如果你不想在所有行之后打印它,删除END块。

awk -v myvar="$name" 'FNR==2 {$0 = $0 FS myvar}1; END{print myvar}' $filename

name=Michele的输出:

#Insert the names separeted by space
l.lovre p.jhonson p.backer t.thompson q.ward Michele
Michele
ffdz8vbo

ffdz8vbo3#

默认情况下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"

至于将新名称附加到第2行末尾,或者在当前文件中没有名称时创建新行的问题:一个想法:

######
# 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"

注:

  • 所有输入行都需要回显到stdout,以便它们“保留”在文件中,因此使用独立的1
  • END {}块处理发生在文件已被处理 * 之后 *;END {}模块生成的任何输出都将进入stdout
  • 如果使用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

相关问题