我有一个列表,其中有许多条目的两种不同的格式:
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
字母代表每一列,所以您需要多少列就需要多少列。然后输出所需的字母。