2013-02-24 87 views
1

我花了一些时间考虑如何解决这个问题,但我不确定,而且我对unix的使用目前相当有限。Unix - 查找文件中的模式,复制到另一个文件

我有一个文本文件,可以给它一个名称为“Text.txt”,其中包含大量的信息。比方说,它包含:

SomethingA: aValue 
SomethingB: bValue 
SomethingC: cValue 
SomethingD: dValue 
SomethingD: anotherDValueThisTime 
SomethingA: aValueToIgnore 

我想通过“TEXT.TXT”进行搜索,并找到了一些值,然后把这些值在一个新的文件,output.txt的。

这会变得更棘手一点,因为我想要做的是获取somethingA的第一个值,然后获取发生的每个SomethingD值。

所以在“output.txt的”输出应该是:

aValue 
dValue 
anotherDValue 

第二个“SomethingA”值要被忽略,因为这已经不是第一次“SomethingA”值。

我想象的逻辑是这样的: 查找SomethingA> output.txt的 找到所有SomethingD的>> output.txt的

但我就是不能完全得到它。 任何帮助非常感谢!

+1

如果somethingD在输入文件中的somethingA之前,您是否在意? – Stobor 2013-02-24 13:49:16

+0

排序不是问题。只要所有的SomethingD都在一起,不管是在开始还是结束时都有A事件发生,这并不重要。 – ThePerson 2013-02-24 13:52:51

+0

在* input *文件中? – Stobor 2013-02-24 13:58:38

回答

2

awk是理想

awk '/^SomethingA/ && ! a++ || /^SomethingD/ { print $2 }' FS=: text.txt > output.txt 

这是一个有点草率,但你可以更精确的搭配:

awk '$1 == "SomethingA" && ! a++ || $1 == "SomethingD" { print $2 }' FS=: text.txt > output.txt 

不幸的是,这需要的钥匙固定字符串。如果你想有一个正则表达式,你可以这样做:

awk 'match($1, "pattern") && ... 
+0

你为我省了很多头撞。感谢您的解决方案,我会花一些时间阅读awk。这个解决方案实际上是第一次完美运行。谢谢。我刚看到你的第二个答案/改进。我只需要一个固定的字符串,因为它们都是相同的。再次感谢,我真的很感激。 – ThePerson 2013-02-24 13:57:57

+0

如果你想在awk中匹配一个正则表达式的字段,你可以使用'$ 1〜/ pattern/{stuff}'或者$ 1!〜/ pattern/{stuff}'。 – Stobor 2013-02-24 14:50:14

+0

@Stobor谢谢,这绝对是比较合适的。我恳求暂时失忆症。 – 2013-02-24 15:00:11

1
grep -m 1 somethingA inputfile.txt >outputfile.txt 
grep somethingD inputfile.txt >>outputfile.txt 

grep选项-m设置你想获得比赛的最大数量。

>>附加到文件而不是覆盖它像>那样。

相关问题