我想在第一次出现时从文件(file.dat)grep一个字符串,并通过从另一个文件(输出)读取来替换它。我有一个名为“output”的文件,例如包含“AAA T 0001
”
#!/bin/bash
procdir=`pwd`
cat output | while read lin1 lin2 lin3
do
srt2=$(echo $lin1 $lin2 $lin3 | awk '{print $1,$2,$3}')
grep -m 1 $lin1 $procdir/file.dat | xargs -r0 perl -pi -e 's/$lin1/$srt2/g'
done
基本上我想要的是:当第一个实例中的文件“file.dat”中有一个字符串“AAA”时,我想用“T”替换“AAA”旁边的第二和第三列0001“但仍保留第一列”AAA“。上面的脚本基本上不起作用。基本上“$ lin1”和$ srt2变量在's / $ lin1 / $ srt2 / g'中无法理解
示例:
在我的file.dat中有一行
AAA D ---- CITY COUNTRY
我想要的是:
AAA T 0001 CITY COUNTRY
非常感谢任何评论。
答案 0 :(得分:1)
如果您有输出文件,请执行以下操作:
$ cat output
AAA T 0001
您的 file.dat 文件包含以下信息:
$ cat file.dat
AAA D ---- CITY COUNTRY
BBB C ---- CITY COUNTRY
AAA D ---- CITY COUNTRY
您可以使用awk
尝试类似的内容:
$ awk '
NR==FNR {
a[$1]=$0
next
}
$1 in a {
printf "%s ", a[$1]
delete a[$1]
for (i=4;i<=NF;i++) {
printf "%s ", $i
}
print ""
next
}1' output file.dat
AAA T 0001 CITY COUNTRY
BBB C ---- CITY COUNTRY
AAA D ---- CITY COUNTRY
答案 1 :(得分:0)
假设您要在$s
中放置要搜索的字符串,并在$r
中放置要替换的字符串,以下操作不会吗?
perl -i -pe'
BEGIN { ($s,$r)=splice(@ARGV,0,2) }
$done ||= s/\Q$s/$r/;
' "$s" "$r" file.dat
(替换第一个实例,如果存在)
答案 2 :(得分:0)
这只会更改文件中的第一个匹配项:
#!/bin/bash
procdir=`pwd`
while read line; do
set $line
sed '0,/'"$1"'/s/\([^ ]* \)\([^ ]* [^ ]*\)/\1'"$2 $3"'/' $procdir/file.dat
done < output
要更改所有匹配的行:
sed '/'"$1"'/s/\([^ ]* \)\([^ ]* [^ ]*\)/\1'"$2 $3"'/' $procdir/file.dat