我有很多文件,我想将某些行导出到新文件,同时保持输入文件不变。例如,我希望将所有以 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
.