根据字母顺序范围从分隔文件中抓取行

根据字母顺序范围从分隔文件中抓取行

我正在解决的问题是我有一个文件,其中包含由“|”分隔的字段并且文件根据这些字段之一进行排序。我一直试图想出的是一种根据某个字段的范围来抓取线条的方法。

一个例子:

示例输入将类似于这样,它根据第二个字段进行排序。所以它们是按字母顺序列出的

1234|abcd|3fgbe32
1234|abce|5fasdf3
5678|abcf|t438fjd
9876|abcg|57fshde

我想要获得的范围将是“我们希望将 abcd - abcf 范围内的所有记录记录到不同的文件中。剩下的记录将是:

1234|abcd|3fgbe32
1234|abce|5fasdf33
5678|abcf|t438fjd

当我开始时,我认为我以错误的方式处理这个问题。我循环遍历每一行,然后尝试根据正则表达式检查该行,看看我是否需要该行。但是使用 awk 和 grep 是否有更好的方法呢?

答案1

落在范围内的所有记录A B C D-ABCF

简单的awk解决方案:

awk -F'|' '$2~/^abc[d-f]$/' file

输出:

1234|abcd|3fgbe32
1234|abce|5fasdf3
5678|abcf|t438fjd

答案2

其他解决方案 :

awk -F'|' '{if ($2 == "abcd") { l=1} else if ($2 == "abcg") { l=0} }l' file 

答案3

Ased解决方案。

要删除范围中第一行之前的行:

cat file | sed '/abcd/Q'

要删除范围中最后一个行之后的行:

cat file | sed -n '/abcf/,$p'

   -n : don't print non-matches
   ,$ : first match to end of file
   p  : print

放在一起:

cat file | sed '/abcd/Q | sed -n '/abcf/,$p'

这些模式将匹配该行中的任何字段,因此您需要一个更好的模式来仅匹配第二个字段:

cat file | sed -r -n '/^[^\|]+\|abcd/,$p' | sed -r '/^[^\|]+\|abce/Q'

使用 sed 的非常简单的范围是:

cat file | sed -n '/abc[def]/p'

答案4

一体化sed解决方案,将范围从abcd到写入abcf名为 的文件other,而其余行则传递到 stdout。因此您不必两次浏览该文件。

sed -e '/|abcd|/,/|abcf|/{wother' -e 'd;}'

相关内容