2014-01-17 4 views
-3

Мне нужно выполнить следующие задачи. Они включены в сценарий bash.скрипт bash для взаимодействия над несколькими файлами

1) Читайте из файла, такого как нижеследующий, и для всех строк, которые имеют как vars var1 = "AB", так и var2 = "14003" Мне нужно поймать подстроку из col 4 с помощью len 8, скажем, в var3 (массив, вероит. или в цикле, а затем удалите эти строки.

2 *563587992014-01-26  2014-01-26T09:45:53  AB 14003 5   3.60 
2 563589242014-01-26  2014-01-26T10:03:13  AB 14003 6   4.80 
2 563589252014-01-26  2014-01-26T10:03:20  TC 14002 2   5.50 
2 563589272014-01-26  2014-01-26T10:03:34  FF 14002 3   3.30 

соответствующих поля, отмеченные * 2) Тогда мне нужно пройти через собранные подстроки и откройте другой файл, подобный приведенному ниже, и удалите все строки, которые подстрока (4,8) соответствует предыдущей, собранной в var3

56370388 1 1.000 95   0.80Double Coffe 
    *56358799 1 1.000 94   0.40Milk‚ 
    *56358799 2 1.000 94   0.40Coffe‚ 
    56370388 1 1.000 97   0.40Descafe 

Я думал, может быть, в вложенном цикле, используя awk и sed. Но входы будут оценены :)

+1

большая часть данных в вашем примере вывода не кажется, быть в вашем примере ввода. Хороший Q на S.O. будет иметь 1. с учетом этого ввода образца, 2. пример вывода образца. 3. Переполнение стека не должно быть источником бесплатного программирования, поэтому вы должны включить в свой вопрос свой текущий код, 4. свой текущий вывод и 5. свои мысли о том, почему он не работает ;-) OK ?!? ;-). Также знайте, что вы можете использовать инструмент '{}' в левом верхнем углу окна ввода кода форматирования кода. Удачи. – shellter

+0

Почему в первой строке в верхнем файле есть только звезда? Разве не должна быть звезда также во втором ряду? (Вторая строка, похоже, также соответствует «var1' и' var2' ..) –

ответ

1

Вот начало: Попробуйте следующий Баш скрипт:

#! /bin/bash 

var1="AB" 
var2="14003" 

awk -vv1="$var1" -vv2="$var2" '  
    NR==FNR { 
     if ($4==v1 && $5==v2) { 
      s=substr($0,4,8) 
      a[s]++ 
     } 
     next 
    } 
    !($1 in a) { 
     print 
    }' file1 file2 

Выход:

56370388 1 1.000 95   0.80Double Coffe 
56370388 1 1.000 97   0.40Descafe 
+0

спасибо Håkon Hægland, но она не работает в моей системе. Если я понимаю, скрипт сравнивает четвертую позицию каждой строки файла1 с vv1 и vv2, и если они совпадают, она генерирует подстроку, назначенную переменной s. Простите мое невежество, но если есть СЛЕДУЮЩИЙ, не должно быть также FOR!? –

+0

@PedroCaldeira Есть ли сообщения об ошибке? –

+0

@PedroCaldeira Операция 'next' не связана с' for' в 'awk'. 'next' используется для обработки следующей входной записи, пропуская все остальные правила в программе' awk'. См.: http://www.gnu.org/software/gawk/manual/gawk.html#Next-Statement –

Смежные вопросы