下面是一个玩具文本文件,其中包含样本和特征信息以及测量值。
Sample3_trait1 8.5
Sample6_trait2 2.2
Sample7_trait1 9.2
Sample3_trait2 1.3
Sample6_trait1 10.0
Sample7_trait2 2.1
我想用更具信息性的内容替换示例列,例如示例的实际名称(比如一个人的名字)。这将相对容易sed
如果只有 3 个样本,例如
sed 's/Sample3/john.D/g' file.txt
我可以对每个“样本”执行此操作。但我有数百或数千个样本名称。
我想做的是给予sed
包含两列的文本文件,原始列和替换列:
Sample3 john.D
Sample6 mary.D
Sample7 kelly.O
....
Sample1001 amy.P
并在整个文件(全局)中的任何位置替换它们,即在找到 Sample3 的位置,替换为 john.D。
我可以用 Bash 中的循环来做这件事吗?我可以循环遍历单个列(逐行),但我不确定如何处理匹配的列。
任何帮助将非常感激。
Use sed
将第二个文件转换为sed
编辑第一个的脚本:
sed 's/\([^ ]*\) \(.*\)/s%\1_%\2_%/' file.2 > sed.script
sed -f sed.script file.txt
rm -f sed.script
Bash 代码中没有循环。请注意_
在图案中;这对于防止Sample3
从映射Sample300
to john.D00
.
如果您应该担心脚本的中断和并发运行,那么 (a) 使用mktemp
生成一个文件名来代替sed.script
,以及 (b) 陷阱中断等以确保删除脚本文件名:
tmp=$(mktemp "${TMPDIR:-/tmp}/sed.script.XXXXXX")
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15
sed 's/\([^ ]*\) \(.*\)/s%\1_%\2_%/' file.2 > $tmp
sed -f $tmp file.txt
rm -f $tmp
trap 0
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)