【问题标题】:Inserting multiple variables on a particular line using awk使用 awk 在特定行上插入多个变量
【发布时间】:2017-01-14 10:24:28
【问题描述】:

我想在特定行(例如第 3 行)插入一些变量(例如 3)。我有以下 MWE。

#!/bin/sh

echo  > testfile
echo  >> testfile
echo  >> testfile
v1=1; v2=2; v3=3
sed -i "3,3c\ $v1  $v2  $v3" testfile
cat testfile

我可以使用awk 一步完成吗?我可以的

awk -v value=$v1 ' NR==3 {$1=value"\t"}1' testfile > tmp; mv tmp testfile

但这是针对一个变量。我必须为v2v3 创建类似的行,这是我不想要的。

PS。在上面的例子中,我使用了三次echo,这样我就可以使用sed/awk直到空testfile的第三行。有没有更聪明的方法在第 n 行插入?

【问题讨论】:

  • awk -v v1="$v1" -v v2="$v2" -v v3="$v3" '…program…' file?我的一个 shell 脚本以这种方式将 8 个变量传递给 awk 脚本。这是否是一个完全好的想法是一个单独的讨论,但可以将所需的尽可能多的变量传递给awk。这大致就是 anubhava 在他的答案中用他的代码显示的内容。
  • MWE 是什么?
  • @JonathanLeffler,是的。 awk -v v1="$v1" -v v2="$v2" -v v3="$v3" 'NR==3 {$1=v1"\t"; $2=v2"\t"; $3=v3}1' testfile > tmp; mv tmp testfile 适用于上述示例。但是@anubhava 的解决方案看起来更有吸引力。 :) @EdMorton MWE => 最小的工作示例。

标签: shell variables awk


【解决方案1】:

你可以试试这个。使用-v 在shell 级别定义变量。

awk -v v1="$one" -v v2="$two" -v v3="$three" 'BEGIN{OFS="\t"} {print "\n\n" v1, v2, v3}'

【讨论】:

    【解决方案2】:

    使用 awk 您可以对空文件执行此操作:

    awk -v OFS="\t" -v n=3 -v v1="$v1" -v v2="$v2" -v v3="$v3" 'BEGIN {
       # print n-1 empty lines
       for (i=1; i<n; i++)
          print ""
       # print v1, v2, v3
       print v1, v2, v3
    }'
    

    【讨论】:

    • 非常好。我没有考虑过使用BEGIN。顺便说一句,第二个print 命令会终止 for 循环吗?
    • for 循环完成后不调用第二次打印。
    • @anubhave 我想我的意思是一样的。 for 循环不允许在同一个循环中连续使用两个 print 命令。
    • for 循环将允许任何数量的打印,如果你将它们包装在 {...}
    猜你喜欢
    • 2011-09-26
    • 2016-08-14
    • 1970-01-01
    • 2020-09-23
    • 2022-01-11
    • 2019-10-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多