我有一个列表,其中包含两种不同格式的条目:
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并附加到同一文件。但是,这根本不起作用。
有什么想法吗?
答案 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
字母代表每一列,因此您需要尽可能多的列。之后,您只需输出所需的字母。