我有两个文件。一个是叫file1.txt
,另一个是person1.txt
。它们都包含一些文本行,如下例所示:
file1.txt
word1
word2
word3
word4
word5
word6
word7
word8
word9
Run Code Online (Sandbox Code Playgroud)
person1.txt
givi sixarulidze
Run Code Online (Sandbox Code Playgroud)
我想要做的是将前七行代码替换file1.txt
为person1.txt
.
givi sixarulidze
word8
word9
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
Whi*_*Owl 14
cp person1.txt result.txt
tail -n+8 file1 >> result.txt
Run Code Online (Sandbox Code Playgroud)
使用 GNUsponge
进行就地编辑file1.txt
:
{ cat person1.txt; tail -n +8 file1.txt; } | sponge file1.txt
Run Code Online (Sandbox Code Playgroud)
这会将person1.txt
文件与文件中除前 7 行之外的所有行连接起来file1.txt
,并将结果保存到file1.txt
.
对于sed
,您会执行相同的操作
sed -e '1r person1.txt' -e '1,7d' file1.txt | sponge file1.txt
Run Code Online (Sandbox Code Playgroud)
(您可以使用8,$!d
代替1,7d
),或者,如果使用 GNU sed
,
sed -i -e '1r person1.txt' -e '1,7d' file1.txt
Run Code Online (Sandbox Code Playgroud)
person1.txt
这会在开头插入 的内容,然后跳过file1.txt
输入文件的前七行。
另一种可能性是awk
:
awk 'NR==FNR || FNR>7' person1.txt file1.txt > result.txt
Run Code Online (Sandbox Code Playgroud)
这将先处理person1.txt
然后再处理file1.txt
。如果有的话,它将打印当前行
NR
(全局行计数器)等于FNR
,每个文件的行计数器,或者NR
大于FNR
)您甚至可以将其扩展为要跳过的每个文件的行规范:
awk -- '--skip<=0' person1.txt skip=7 file1.txt skip=4 file2.txt >result.txt
Run Code Online (Sandbox Code Playgroud)
然后,您只需在每个文件名之前添加一个变量赋值,将变量设置awk
为skip
您想要从相应输入文件中跳过的行数。程序awk
针对每个已处理的行检查此变量(如果递减 1)是否低于零,这表明已达到要跳过的行数。那么条件将是true
, 并打印当前行。
请注意,--
需要“选项结束”说明符,因为实际程序的第一个命令以--
.
这可以通过以下方式完成sed
步骤是删除前 6 行。当你到达第七行时,你需要读入另一个文件,然后删除第七行。
sed '1,6d
7{
r person1.txt
d
} ' file1.txt > newfile1.txt &&
mv newfile1.txt file1.txt
Run Code Online (Sandbox Code Playgroud)
某些版本sed
有一个-i
标志来进行“就地”编辑。
另一种方法是使用tail
.
{
cat person1.txt
tail -n +8 file1.txt
} > newfile1.txt && mv -f newfile1.txt file1.txt
Run Code Online (Sandbox Code Playgroud)
这里将两个命令放在一起,并将输出重定向到一起。