2012-05-11 4 views
0

У меня есть файл xx.txt, как это.удаление строк из текстовых файлов на основе последнего символа, которые находятся в другом файле с использованием awk или sed

1PPYA 
2PPYB 
1GBND 
1CVHA 

Первая строка этого файла - «1PPYA». Я хотел бы

  1. Прочитать последний символ «1PPYA». В этом примере это «A /»
  2. Найдите «1PPY.txt» (первые четыре символа) из каталога «yy».
  3. Удалить строки, начинающиеся с «csh», которые содержат символ «A».

Учитывая следующее "1PPY.txt" в "уу" каталог:

csh 1  A 1  27.704 6.347 
csh 2  A 1  28.832 5.553 
csh 3  A 1  28.324 4.589 
csh 4  B 1  27.506 3.695 
csh 5  C 1  29.411 4.842 
csh 6  A 1  28.378 4.899 

Требуемая мощность будет:

csh 4  B 1  27.506 3.695 
csh 5  C 1  29.411 4.842 
+3

И вы хотите, чтобы пользователи SO предлагали цену для вашего проекта сейчас? Сначала скажите нам, где вы застряли. – anubhava

+1

Пожалуйста, покажите нам, что вы пробовали, и тогда мы сможем вам помочь. – dj18

ответ

0

Это может работать для вас:

sed 's|^ *\(.*\)\(.\)$|sed -i.bak "/^ *csh.*\2/d" yy/\1.txt|' xx.txt | sh 

нотабене Я добавил резервную копию файла. Если это не требуется внесению поправок в -i.bak к -i

+0

Огромное вам спасибо – darwin

0

Вы можете использовать этот Баш скрипт:

while read f l 
do 
    [[ -f $f ]] && awk -v l=$l '$3 != l' $f 
done < <(awk '{len=length($0);l=substr($0,len);f=substr($0,0,len-1);print "yy/" f ".txt", l;}' xx.txt) 

Я разместил это, потому что вы новый пользователь, однако это будет много лучше показать нам, что вы пробовали, и где вы застряли.

1

Если предположить, что оболочка является Баш

while read word; do 
    if [[ $word =~ ^(....)(.)$ ]]; then 
     filename="yy/${BASH_REMATCH[1]}.txt" 
     letter=${BASH_REMATCH[2]} 
     if [[ -f "$filename" ]]; then 
      sed "/^csh.*$letter/d" "$filename" 
     fi 
    fi 
done < xx.txt 

Как вы помечено вопрос с AWK:

awk '{ 
    filename = "yy/" substr($1,1,4) ".txt" 
    letter = substr($1,5) 
    while (getline < filename) 
     if (! match($0, "^csh.*" letter)) 
      print 
    close(filename) 
}' xx.txt 
+0

+1 - Вы, наверное, хотите 'sed -i' в версии Bash. И перенаправление/переименование в версии AWK. (предполагая, что OP не хочет одного потока вывода) –

0

TxR:

@(next "xx.txt") 
@(collect) 
@*[email protected]{suffix /./} 
@ (next `yy/@prefix.txt`) 
@ (collect) 
@ (all) 
@{whole-line} 
@ (and) 
@  (none) 
@shell @num @suffix @(skip) 
@  (end) 
@ (end) 
@ (do (put-string whole-line) (put-string "\n")) 
@ (end) 
@(end) 

Пробег:

$ txr del.txr 
csh 4  B 1  27.506 3.695 
csh 5  C 1  29.411 4.842 
txr: unhandled exception of type file_error: 
txr: (del.txr:5) could not open yy/2PPY.txt (error 2/No such file or directory) 

Из-за наружной @(collect)/@(end) (легко снимается), это обрабатывает все строки из xx.txt, а не только первую строку, и поэтому она взрывается, потому что у меня нет 2PPY.txt.