在Bash中,如何从文件中提取单词和后续数字?

时间:2013-04-26 22:39:31

标签: bash sed awk text-extraction

我有一个列表,其中包含两种不同格式的条目:

Generated Request {some text} easy level group X
---or---
easy level group X {some text}

其中X是1-6位数之间的数字。

我正在尝试逐行浏览该文件,并将所有内容减少到每行上的“组X”(以便我可以将其与另一个文件进行比较)。

我会在下面发布我的尝试,所以你可以和我一起嘲笑它,但我只是拿起bash,awk和sed的基础知识,所以我现在为这个攻击好脚本而道歉... < / p>

for line in $(< abc.txt);do
  if [ ${line:0:2} == "Ge" ] then
  awk '{print $8,$9}' $line >> allgood.txt
  elif [ ${line:0:2} == "ea" ] then
  awk '{print $3,$4}' $line >> allgood.txt
  fi
done

尝试的逻辑是,如果它以“Ge”开头,则提取短语$ 8和$ 9并附加到文件。如果它以“ea”开头,则提取短语$ 3和$ 4并附加到同一文件。但是,这根本不起作用。

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

解决此问题的最简单方法是使用grep

grep -o 'group [0-9]*' file

-o选项仅显示该行的匹配部分。


您永远不必使用bash循环遍历文件中的每一行,然后将该行传递给awk,因为这正是awk的工作原理,它会遍历每一行并应用相关的块。这是一种在纯awk中使用逻辑的方法:

awk '/^Ge/{print $8,$9}/^ea/{print $3,$4}' file

答案 1 :(得分:1)

您可以使用“while read”执行此操作,如果您愿意,请避免使用awk:

while read a b c d e f g h i; do 
  if [ ${a:0:2} == "Ge" ]; then 
    echo $h $i >> allgood.txt; 
  elif [ ${a:0:2} == "ea" ]; then
    echo $c $d >> allgood.txt;
  fi;
done < abc.txt

字母代表每一列,因此您需要尽可能多的列。之后,您只需输出所需的字母。