2013-03-05 5 views
2

Я хотел grep строку в первом вхождении ТОЛЬКО из файла (file.dat) и заменить его, читая из другого файла (вывод). У меня есть файл под названием «Выход» в качестве примера содержит «AAA T 0001»grep и замените

#!/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 

В основном то, что я хотел: когда-либо строка «AAA» является grep'ed из файла «file.dat» на первом Например, я хочу заменить второй и третий столбцы рядом с «AAA» на «T 0001», но при этом сохранить первый столбец «AAA» как есть. Th выше скрипта в принципе не работает. В основном "$ Lin1" и $ SRT2 переменные не понял внутри 'с/$ Lin1/$ SRT2/г'

Пример:

в моем file.dat У меня есть ряд

ААА D - --- ГОРОД СТРАНА

Что я хочу:

AAA T 0001 ГОРОД СТРАНА

Любые комментарии очень.

+0

, если вам нужно чтобы заменить только первое сообщение, вы должны отбросить «g» в perl regexpr подстановки: perl -pi -e 's/$ lin1/$ srt2 /' –

+0

извините, не понял, что вы хотите сделать. . :( – Kent

+0

Редактирование вашего вопроса для включения ввода образца и требуемого вывода сделало бы намного проще обеспечить решение. Удачи. – shellter

ответ

0

Скажите, что вы поместите строку для поиска в $s и строку, которую нужно заменить в $r, не будет делать следующее?

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

(Заменяет первый экземпляр если таковой имеется)

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 
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 
Смежные вопросы