在Bash中,如何从文件中提取一个单词和后面的数字



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

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

任何想法吗?

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

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

-o选项只显示行中匹配的部分。


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

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

您可以使用"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

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

相关内容

  • 没有找到相关文章

最新更新