我有一个名为file.txt的文件,其中包含以下内容:
123
223
Lane,id,s_id_sample_id
1,3_range.single_try,N76
2,44_range.single_try,N77
3,92_out_range.double_try,N79
我喜欢循环浏览此文件并执行以下操作:
从' Lane'然后用逗号分割并取第二列(id) 然后取出id列并在下划线上拆分 使用' X'搜索并替换所有点和下划线。除了最后两个理解之外。所以不要搜索并替换最后一个下划线(例如double_try)。
所以最终会得到:
123
223
Lane,id,s_id_sample_id
1,3Xrange_single_try,N76
2,44Xrange_single_try,N77
3,92XoutXrange_double_try,N79
这就是我所做的:
while IFS=',' read -r f1 f2; do
sed -e 's/_/X/g;s/\./X/g;s/'
echo "$f1,$f2"
done < "$file" > output
mv output $file
问题是如何指定忽略最后两个下划线?
答案 0 :(得分:1)
首先用'@'
替换最后两个点或下划线,然后用'X'
替换剩余的点和下划线,最后用下划线替换所有'@'
个字符:
IFS=','
while read -r f1 f2 f3; do
f2=$(sed 's/[._]\([^._]\+\)[._]\([^._]\+\)$/@\1@\2/;s/[._]/X/g;s/@/_/g' <<< "$f2")
echo -n "$f1"
[[ -n $f2 ]] && echo -n ",$f2"
[[ -n $f3 ]] && echo -n ",$f3"
echo
done < "$file" > output
mv output "$file"
如果输入数据中可能出现'@'
,您可能需要使用其他字符。任何你可以合理肯定的东西都不会出现在你的输入中。