2

我只想在第一次出现时从文件(file.dat)中获取一个字符串,并通过从另一个文件(输出)中读取来替换它。我有一个名为“输出”的文件,例如包含“ 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”中grep字符串“AAA”时,我想用“T 0001”替换“AAA”旁边的第二和第三列但是仍然保持第一列“AAA”不变。上面的脚本基本上不起作用。基本上在 's/$lin1/$srt2/g' 中不理解 "$lin1" 和 $srt2 变量

例子:

在我的 file.dat 我有一排

AAA D----城市国家

我想要的是:

AAA T 0001 城市 国家

任何意见都非常感谢。

4

3 回答 3

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
于 2013-06-11T04:32:44.497 回答
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
于 2013-06-11T05:12:01.383 回答
0

假设您将要搜索$s的字符串和要替换的字符串放在 in 中$r,以下不是吗?

perl -i -pe'
   BEGIN { ($s,$r)=splice(@ARGV,0,2) }
   $done ||= s/\Q$s/$r/;
' "$s" "$r" file.dat

(如果存在则替换第一个实例)

于 2013-03-05T21:55:54.713 回答