在文件的特定行中插入文本

在文件的特定行中插入文本

如何在文件的特定行中插入一些文本?我可以使用的最简单的方法是什么? ( bash,,, sed? awk)

我想做的事情可能很简单,但我不知道应该从哪里开始。我尝试手动执行此操作需要花费太多时间(我有很多文件必须更改以供以后使用 Excel/Calc)。

这是我的输入文件示例:

4.06
4.05
5.04
4.06
34.50
56.06
45.33
36.44

我想要这样的东西(在第 1 行和第 5 行之前插入文本):

Exp1    
4.06
4.05
5.04
4.06
Exp2
34.50
56.06
45.33
36.44

我怎样才能做到这一点?

答案1

awk 'NR==1{print "Exp1"}NR==5{print "Exp2"}1' file

1 结尾的意思是{print}.

sed '1i\
Exp1
5i\
Exp2
' file

如果您想将其扩展到更多数字,awk那就很简单:

awk 'NR%4==1{print "Exp"++i}1' file

对于不同的数字,我们只能说 sed 不是完成这项工作的正确工具。这是可能的,但并不漂亮。


作为一种学术好奇心,它在 sed 中如下:

sed '1{ 
    h
    s/^.*$/Exp0/
    x   
}
x
s/^4//
s/^3/4/
s/^2/3/
s/^1/2/
/^E/ { 
    s/$/|/
    :x
    s/0|/1/
    s/1|/2/
    s/2|/3/
    s/3|/4/
    s/4|/5/
    s/5|/6/
    s/6|/7/
    s/7|/8/
    s/8|/9/
    s/9|/|0/
    tx
    s/^Exp|/Exp1/
    p
    s/^/1/
}
x' file

答案2

如果每个实验(我再次假设)中的数据点数量(我假设)始终为 4,则可以使用此 Perl 单行代码:

perl -ple '$. % 4 == 1 and print "Exp", ++$i' your_file

怎么运行的

  • -p开关告诉 Perl 逐行循环给定的文件(默认情况下),并在执行您提供的任何代码后打印每一行。
  • -l开关告诉 Perl 自动为每个print语句附加一个换行符(默认情况下)。
  • -e开关通知 Perl 后面的内容都是要执行的代码(在打印文件的每一行之前将执行的代码)。
  • 特殊变量$.保存当前正在处理的行号。如果该行号等于 1 modulo 4 ( $. % 4 = 1),则意味着我们需要Exp #在其之前插入。
  • 所以我们测试$. % 4 == 1,如果是真的,我们打印Exp ++$i\n\n由开关添加的位置-l)。这是可行的,因为未定义的变量在首次用作整数时被 Perl 赋予零值。

使其适用于多个文件

  • $.如果您一次处理多个文件,该变量将不会重置其值。显然,这不是您想要的。您可以通过显式写出-p上面一行中创建的隐式循环来解决此问题,以便您可以操作该continue块。

    perl -le '
        while(<>){
            $. % 4 == 1 and print "Exp ",++$i
        } continue {
            print;             # Print the current line
            if(eof){           # If the next line is the end-of-file
                close ARGV ;   # Close the current filehandle to reset $.
                $i = 0     ;   # Reset the experiment counter if you need
            }
        }
    ' list_of_your_files
    

笔记

  • 上述两种解决方案都会将修改后的文件打印到标准输出。要模拟就地编辑(即编辑文件本身),请添加一个-i开关:

    perl -pi -le '$. % 4 == 1 and print "Exp", ++$i' your_file
    
    • 对其他解决方案进行类似的操作。
    • 确保不要直接在后面放置另一个开关,-i因为它会将后面的任何内容解释为要使用的扩展名,以创建备份文件。

    • 我建议你-i先不加测试,如果结果满意的话再添加。

答案3

您不需要外部语言,一些标准命令就可以做到这一点。例如,要在 origin.txt 的第 5 行插入一些内容,您可以执行以下操作:

tmpfile=`mktemp`
head -n4 origin.txt > $tmpfile
echo "I'm line 5 now" >> $tmpfile
tail -n +5 origin.txt >> $tmpfile
mv $tmpfile origin.txt

答案4

我发现这个问题正在寻找一种将注释(#)符号添加到文件中指定行的开头的方法。使用上面的示例和其他一些示例,我发现这是在指定行打印某些内容的 awk 命令。

awk 'NR==1{print "#"$0; next}1' <file

NR==1是要考虑的行。
print "#"是将 $0插入添加到包含所提供的行的其余部分的字符串中的内容next,告诉它跳过该行(已打印它,否则您将获得两次),并且如上所述,尾随1插入文件的其余部分。

相关内容