【问题标题】:Prepend text to specific line numbers with variables将文本添加到带有变量的特定行号
【发布时间】:2019-12-27 19:29:24
【问题描述】:

我花了几个小时试图解决这个问题。关于如何在所有行或特定行前面加上可变文本和可变数字,有很多答案。

while [ $FirstVariable -lt $NextVariable ]; do
  #sed -i "$FirstVariables/.*/$FirstVariableText/" "$PWD/Inprocess/$InprocessFile"
  cat "$PWD/Inprocess/$InprocessFile" | awk 'NR==${FirstVariable}{print "$FirstVariableText"}1' > "$PWD/Inprocess/Temp$InprocessFile"
  FirstVariable=$[$FirstVariable+1]
done 

基本上我正在寻找一个特定的字符串分隔符,然后找出下一个分隔符的位置并将第一个结果附加到以下行中......请注意,我已经弄清楚了我只是在行前遇到问题的逻辑与变量。

例子:

这个>

Line1:
1
2
3

Line2:
1
2
3

会变成>

Line1:
Line1:1
Line1:2
Line1:3

Line2:
Line2:1
Line2:2
Line2:3

【问题讨论】:

  • 请编辑您的 Q 以包含变量 $NextVariable 的值。但这都可以在一个awk 脚本中完成。看看Awk Tutorial。并且Line1Line2 部分之间真的有空行吗?如果不是,请编辑您的示例数据以准确显示数据。祝你好运。

标签: bash text awk sed


【解决方案1】:

您解决问题的方法是使用 bash 和 awk 解析所有内容以处理文件。您使用 bash 提取一行,然后使用 awk 操作这一行。整个事情实际上可以用一个 awk 脚本完成:

awk '/^Line/{str=$1; print; next}{print (NF ? str $0 : "")}' inputfile > outputfile

awk 'BEGIN{RS="";ORS="\n\n";FS=OFS="\n"}{gsub(FS,OFS $1)}1' inputfile > outputfile

【讨论】:

    【解决方案2】:

    您可以使用下面的 awk 一个班轮来完成所有这些工作。

    假设您的模式以Line 开头,则可以使用以下脚本。

    > awk '{if ($1 ~ /Line/ ){var=$1;print $0;}else{ if ($1 !="")print var $1}}' $PWD/Inprocess/$InprocessFile
    
    Line1:
    Line1:1
    Line1:2
    Line1:3
    Line2:
    Line2:1
    Line2:2
    Line2:3
    

    上面的脚本是这样工作的:

    如果第一条记录包含单词Line,那么它将被复制到一个awk 变量var。从下一个单词开始,如果记录不为空,则将新创建的 var 附加到该记录并打印它以产生所需的结果。

    如果您需要将变量从 shell 动态传递到 awk,您可以使用 -v 选项。如下:

    awk -v var1=$FirstVariable -v var2=$FirstVariableText 'NR==var{print var2}1' > "$PWD/Inprocess/Temp$InprocessFile"
    

    【讨论】:

    • 不幸的是,它不是静态的,而是特定于行的。我有额外的逻辑来识别通过 while 语句计算行数直到下一个问题的行号。问题是使用变量 $FirstVariable 放置唯一行号的变量,复制该行的内容并添加 $FirstVariableText 的唯一内容
    • @JamesCarlin 如果您需要将变量从 shell 动态传递到 awk,您可以使用 -v 选项。如果这是您的要求,请查看编辑后的答案。
    猜你喜欢
    • 1970-01-01
    • 2016-09-13
    • 1970-01-01
    • 2018-11-25
    • 2018-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多