2014-12-18 2 views
-3

У меня есть два файла f1.txt и f2.txt. Я хочу, чтобы удалить строки в файле 1 (f1.txt), если в первом столбце есть соответствующая запись в File2 (f2.txt). f2 имеет только 1 столбец на строку, так как каждая строка f.txt будет иметь два или более столбца. Вот пример:Удаление записей из файла путем сопоставления столбца с столбцом из другого файла

кошка f1.txt

1, 10, 20, 30, 40, 50, 60, 70, 80, 90, 1000 
2, 100, 200, 300, 400 
3, 100, 2000, 3000 
4, 400, 500 
5, 500, 600, 700, 800, 900, 1000 

кошка f2. TXT

2 
4 

Вот желаемый результат:

1, 10, 20, 30, 40 
3, 100, 2000, 3000, 400 
5, 500, 600, 700, 800 
+3

прочитайте столбец f2.txt в наборе, затем для каждой строки в файле f1.txt отделите первый столбец и посмотрите, есть ли его в наборе. мы не пишем ваш код, просто предложите, как его улучшить. – tdelaney

+1

Куда шли 6-е и последующие поля из строк 1 и 5? Откуда взялись «400» в конце строки 3? Положите немного усилий, чтобы задать вопрос. –

+1

Попробуйте следующее: 'awk 'FNR == NR {a [$ 1]; next} {p = 1; c = + $ 1; для (i в a), если (c == i) p = 0} p' f2. txt f1.txt' – Jotne

ответ

2

Измените файл шаблона f2.txt, как это:

sed -i -e 's/^/\^/;s/$/\\b/' file1 

f2.txt будет выглядеть

^2\b 
^4\b 
etc. 

Затем сравните файлы с grep:

grep -vf f2.txt f1.txt 
+1

Каждый раз, когда вы пишете цикл оболочки, чтобы манипулировать текстом, у вас неправильный подход. Кроме того, что, по вашему мнению, произойдет, если у вас есть решение, если f2.txt имеет строку с 1 в ней, а f1.txt имеет строку, начинающуюся с, скажем, 10? –

+1

@ Эд Мортон Вы правы Я забыл запятую, считая, что числа разделены запятыми. Что бы вы предложили, это был бы лучший подход, используя awk ?. – Bolboa

+1

Да, awk - это инструмент, который ребята, изобретенные оболочкой, придумали для оболочки, чтобы вызвать манипулирование текстом. Весь сценарий можно сделать сжато, эффективно и надежно, как только 'awk -F, 'NR == FNR {a [$ 0]; next}! ($ 1 in a)' f2.txt f1.txt' –

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