正则表达式和.csv格式的定位项目

时间:2014-05-15 17:56:23

标签: regex csv awk sed position

这是我需要解决的问题:

给出以下字母集的标题为.csv文件:H,A,D,E,R,T,Y,B,D

我需要处理一组字母,让它们放在合适的位置: 例如,提供以下字母组:E,R,T,YB,D,T,Y,B,DH,A,D,E,R等。

每封信都有自己的固定位置 例如:" H"始终是该行的第一个字母," A"第二个,等等...... 我需要用逗号分隔并保持正确的位置来定位一组字母

一组字母ERTY的前言我将:,,,E,R,T,Y,,,
对于HADER,我会H,A,D,E,R,,,,


我的第一次尝试是计算丢失逗号的数量。例如:

echo "E,R,T,Y" | sed 's/[^,]//g' | awk '{ print length }' | xargs -n 1 bash -c 'echo $((9-$1))' args`

现在我试图将缺少的逗号添加到正确的位置。但是我陷入了这一步。

3 个答案:

答案 0 :(得分:2)

以下awk脚本应该可以工作:

s='H,A,D,E,R,T,Y,B,D'

awk -v p='HADER' -F, 'NR==1{for (i=1; i<=NF; i++) 
 {printf "%s%s", index(p, $i)?$i:"", (i<NF)?OFS:RS; sub($i, "", p)} print ""}' OFS=, <<<"$s"
H,A,D,E,R,,,,

awk -v p='ERTY' -F, 'NR==1{for (i=1; i<=NF; i++)
 {printf "%s%s", index(p, $i)?$i:"", (i<NF)?OFS:RS; sub($i, "", p)} print ""}' OFS=, <<<"$s"
,,,E,R,T,Y,,

答案 1 :(得分:1)

使用bash和GNU grep:

partial() { 
    # $1 is the header
    # $2 is the "substring" line
    local prefix suffix
    prefix=$( grep -oP ".*(?=$2)"  <<<"$1" ) || return 1
    suffix=$( grep -oP "(?<=$2).*" <<<"$1" )
    echo "${prefix//[^,]/}${2}${suffix//[^,]/}"
}
partial "H,A,D,E,R,T,Y,B,D" "B,D"
partial "H,A,D,E,R,T,Y,B,D" "A,D,E"
partial "H,A,D,E,R,T,Y,B,D" "A,D,E,"
partial "H,A,D,E,R,T,Y,B,D" "foo" || echo "foo is not a substring"
,,,,,,,B,D
,A,D,E,,,,,
,A,D,E,,,,,
foo is not a substring

不依赖grep的版本:

partial () { 
    local prefix suffix
    prefix=${1%%${2}*}
    [[ $prefix == "$1" ]] && return 1
    suffix=${1##*${2}}
    echo "${prefix//[^,]/}${2}${suffix//[^,]/}"
}

答案 2 :(得分:0)

这可能适合你(GNU sed):

sed -r 's/$/\nH,A,D,E,R,T,Y,B,D/;s/(.*)\n(.*)\1(.*)/\2\n\1\n\3/;h;s/[^,\n]//g;G;s/^(.*)\n.*\n(.*)\n.*\n(.*)\n.*/\1\3\2/' file

将该组字母附加到partial。放置部分标记eitherside(使用反向引用)。复制结果,从字符串中删除字母,留下,&s和标记(\n s)。附加副本并使用标记重新排列字符串。