我正在解决的问题是我有一个文件,其中包含由“|”分隔的字段并且文件根据这些字段之一进行排序。我一直试图想出的是一种根据某个字段的范围来抓取线条的方法。
一个例子:
示例输入将类似于这样,它根据第二个字段进行排序。所以它们是按字母顺序列出的
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解决方案 :
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;}'