UNIX模式序列



下面的场景是使用UNIX Shell进行模式搜索,其中需要出现两个字符串之间的模式,然后需要出现一个具有序列的新列

输入数据

1|AB|1|2            
2|BC|1|2                          
ID CLOSED                           
3|AB|1|2                
4|BC|1|2                      
ID CLOSED            

查询

根据上面的数据,我们需要在UN之后添加SEQ列,它应该将
SEQ 1添加为第一个值,将序列2添加为第二部分,以此类推,直到End。

预期输出

1|AB|1|2|1   
2|BC|1|2|1  
3|AB|1|2|2   
4|BC|1|2|2                

尝试解决方案作为第一部分,但没有给出正确的输出

sed -n '/^ID/,/^ID CLOSED/{p;/^pattern2/q}'

使用sed有什么特别的原因吗?似乎更适合awk:

awk -v{,O}FS='|' '
BEGIN    { seq = 1 }
/CLOSED/ { seq++ }
!/^ID/   { $5=seq; print }'

输出:

1|AB|1|2|1
2|BC|1|2|1
3|AB|1|2|2
4|BC|1|2|2

可以这样写:

(
seq=1
echo "ID NAME ID1 ID2 ID3 UN SEQ"
while read id name id1 id2 id3 un; do
[ "$id $name" = "ID NAME" ] && continue
[ "$id $name" = "ID CLOSED" ] && { let "seq+=1"; continue; }
echo "$id $name $id1 $id2 $id3 $un $seq"
done < /path/to/the/datafile
echo "ID CLOSED"
) | column -t -s' '

我认为仅用sed指令执行此操作并非不可能,但要困难得多;)

相关内容

  • 没有找到相关文章

最新更新