一次将行全部移动到单独的文件

一次将行全部移动到单独的文件

我有很多文件,我想将某些行导出到新文件,同时保持输入文件不变。例如,我希望将所有以 a 开头的行发送到一个新文件(我们称之为 a.txt),然后我希望将所有其他行发送到一个单独的文件 bcd.txt。

a.......

b.......

c.......

a.......

d.......

目前,我正在grep '^a' infile.txt > a.txt执行第一部分,然后复制输入文件并用于sed -i 's/^a.*$//g删除以 a 开头的 a 行。有没有办法可以完成这两项任务,同时保留原始输入文件而不重复它?

答案1

要获取所有以 开头的行a

grep '^a' infile.txt >a.txt

要获取所有不以“a”开头的行:

grep '^[^a]' infile >bcd.txt   # or grep -v '^a' infile.txt >bcd.txt

该表达式的[^...]意思是“任何不在该字符集中的字符”并且该字符集包含单个a.

联合行动,使用awk

awk '/^a/ { print >"a.txt"; next } { print >"bcd.txt" }' infile.txt

awk程序触发以 an 开头的任何行的第一个块,a以及所有其他行(不是行a,因为next第一个块中的语句)的第二个块。该print >filename语句会将当前行打印到给定文件。

答案2

如果您希望a将非行发送到bcd.txt,只需反转grep

grep    '^a' infile.txt > a.txt
grep -v '^a' infile.txt > bcd.txt

另一种仅使用一个命令的选项是 awk:

awk '/^a/ { print > "a.txt" } ! /^a/ { print > "bcd.txt" }' < input

稍微重新排列一下,看起来像:

awk '
    /^a/ { print > "a.txt" } 
  ! /^a/ { print > "bcd.txt" }' 
  < input

...其中以 开头的行a进入第一个块并写入(附加)到a.txt,而以不是从进入第二个块开始a并写入(附加)到bcd.txt.

相关内容