0

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

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

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

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

我将在下面发布我的尝试,这样你就可以和我一起笑了,但我只是学习了 bash、awk 和 sed 的基础知识,所以我现在为这种对良好脚本的攻击表示歉意......

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 并附加到同一个文件中。但是,这根本不起作用。

有什么想法吗?

4

2 回答 2

3

这个问题最简单的方法是使用grep

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

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


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

awk '/^Ge/{print $8,$9}/^ea/{print $3,$4}' file
于 2013-04-26T22:43:40.167 回答
1

您可以使用“读取时”执行此操作,如果您愿意,可以避免使用 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

字母代表每一列,所以你需要多少列。之后,您只需输出所需的字母。

于 2013-04-26T22:55:42.447 回答