这是我需要解决的问题:
给出以下字母集的标题为.csv文件:H,A,D,E,R,T,Y,B,D
我需要处理一组字母,让它们放在合适的位置:
例如,提供以下字母组:E,R,T,Y
或B,D,
或T,Y,B,D
或H,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`
现在我试图将缺少的逗号添加到正确的位置。但是我陷入了这一步。
答案 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)。附加副本并使用标记重新排列字符串。