4

如果我有一个文件 test.txt:

example 1 content 2013-3-8:
hello java
example 2 content 2013-4-9:
hello c

如何使用 awk 或 sed 将 test.txt 分隔为两个文件

测试1

hello java

测试2

hello c

我使用下面的命令:

awk '/example/{i++}{print > "test"i}' test.txt

但它将保留第一行(例如 xxx),我可以在 awk 的打印中添加一些片段以删除第一行吗?

4

7 回答 7

6

你几乎拥有它:

awk '/^example/ { i++; next } { print >"test"i}'

使得跳过其余的语句nextawk

于 2013-10-29T05:56:47.563 回答
2

您可以使用getline跳过第一行。以下应给出所需的输出:

awk '/example/{getline; i++}{print > "test"i}' test.txt
于 2013-10-29T05:47:14.493 回答
1

使用 sed 执行此操作的一些奇怪方法:

sh <<< $(sed '/example/{N;s/\n//;s/example \([0-9]*\).*:\(.*\)/echo "\2" >> test\1;/}' input)
于 2013-10-29T08:04:49.450 回答
1

这可能对您有用(GNU sed):

sed -ne '2~4w test1.txt' -e '4~4w test2.txt' test0.txt
于 2013-10-29T10:34:14.360 回答
0

你可以尝试类似的东西:

awk 'BEGIN {i=0; j=0} /example/{i++; j=0} (j != 0){print > "test"i} {j++}' test.txt
于 2013-10-29T05:58:13.063 回答
0
sed -n "
/example 1/ {N;s/^.*\n//
   w test1.txt
   }
/example 2/ {N;s/^.*\n//
   w test2.txt
   }" test.txt

如果您在部分之间定义分隔符(定义大小或标记),则可能会在每个文件中放入更多文本

于 2013-10-29T07:56:22.170 回答
0

要完成来自 Alok Singhal 的回复:如果在 linux 上达到“打开文件过多”的限制,则必须关闭行中的文件。

awk '/^example/ {close("test" i); i++; next } { print >"test" i}'
于 2014-03-12T14:02:26.890 回答