如何在文件的特定行中插入一些文本?我可以使用的最简单的方法是什么? ( 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
插入文件的其余部分。