【问题标题】:Unix - Find patterns in file, copy into another fileUnix - 在文件中查找模式,复制到另一个文件中
【发布时间】:2013-02-09 17:36:07
【问题描述】:

我花了一些时间考虑如何解决这个问题,但我不确定,到目前为止我对 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

但我就是不明白。 非常感谢任何帮助!

【问题讨论】:

  • 你关心输入文件中somethingD是否在somethingA之前?
  • 订购不是问题。只要所有的SomethingD都在一起,somethingA是在开头还是结尾都没有关系。

标签: unix awk grep find


【解决方案1】:

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") && ...

【讨论】:

  • 你为我省了很多麻烦。感谢您的解决方案,我将花一些时间阅读 awk。这个解决方案实际上第一次完美运行。谢谢你。我刚刚看到你的第二个答案/改进。我只需要一个固定的字符串作为键,因为它们都是一样的。再次感谢,我真的很感激。
  • 如果你想在 awk 中匹配一个字段和一个正则表达式,你可以使用$1 ~ /pattern/ { stuff }$1 !~ /pattern/ { stuff }
  • @Stobor 谢谢,这绝对更合适。我恳求暂时失忆。
【解决方案2】:
grep -m 1 somethingA inputfile.txt >outputfile.txt
grep somethingD inputfile.txt >>outputfile.txt

grep 选项 -m 设置您想要获得的最大匹配数。

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

【讨论】:

    【解决方案3】:

    我认为您需要的是带有-o 选项的grep 命令。它的工作原理是这样的:

    grep -o -e 'pattern1' -e 'pattern2' /tmp/1 >> /tmp/2
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-12
      • 1970-01-01
      • 2019-06-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-10-05
      相关资源
      最近更新 更多