下面的场景是使用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
指令执行此操作并非不可能,但要困难得多;)