Intereting Posts
Jumping ssh хосты без netcat Как настроить linux для вывода на монитор Настройка часового пояса по всему миру для OpenIndiana Hipster? Есть ли дистрибутив Linux, сертифицированный UNIX? Могу ли я настроить тачпад ноутбука только для прокрутки? Если символическая ссылка на NFS указывает на локальный диск, будет ли потерян локальный диск? Какие команды могут выполняться с exec? Что делать после установки Scientific-Linux 6.1 для настольных целей Любой сайт, который предлагает интерактивный опыт работы с средами GNU / Linux Desktop? Объединить две бинарные строки в форме base64 Postfix больше не регистрируется в / var / log / mail после его удаления и повторного создания? Как разбить несколько столбцов на два столбца на основе первого столбца Почему у меня нет настроек hidraw в моей системе и как я могу исправить свои устройства USB? Могу ли я запретить использование пространства подкачки для определенного процесса (и его просто убить)? Демон tgt не работает должным образом

Как переместить строку из файла в другой файл на основе сопоставления с образцом?

Я хочу переместить строки из текстового файла в другой текстовый файл. Эти строки содержат слово, начинающееся с подчеркивания. Это слово находится на шестом поле строк; поля разделены косой чертой. Например, переместите строки, содержащие _Nokia в шестое поле в примере входного файла ниже.

 Apple/One-plus/Samsung/Mi/Sony/_Nokia/ Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/ Apple/One-plus/Samsung/Mi/HTC/OPPO/ 

Я попытался переместить соответствующие строки с регулярным выражением, используя grep , но это не работает.

 $ grep -F 'Apple/One-plus/Samsung/Mi/^[a-zA-Z]([\w -]*[a-zA-Z])?$/_Nokia/' match.txt >file1.txt $ grep -F -v "Apple/One-plus/Samsung/Mi/^[a-zA-Z]([\w -]*[a-zA-Z])?$/_Nokia/" match.txt \ > match.txt.tmp && mv match.txt.tmp match 

Ожидаемый результат

 $ cat file1.txt Apple/One-plus/Samsung/Mi/Sony/_Nokia/ Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/ $ cat match Apple/One-plus/Samsung/Mi/HTC/OPPO/ 

Как переместить строку из файла в другой файл на основе сопоставления с образцом?

Если у вас достаточно свежая версия GNU awk ( gawk ), вы можете сделать

 awk -i inplace -F'/' '$7 == "_f" {print > "otherfile"; next} 1' file 

Если ваш awk не поддерживает опцию -i inplace , вы можете сделать то же самое, но перенаправить вывод во временный файл и затем переименовать его.

Оригинальный выпуск

Регулярное выражение не может быть указано с опцией -F относительно grep . Есть еще одна проблема, связанная с регулярным выражением. Если символ ^ используется в качестве привязки для соответствия началу строки, то он должен быть первым символом регулярного выражения.

 prompt% cp -v input input.back prompt% grep -e "$regex" input.back > output prompt% grep -v "$regex" input.back > input 

Регулярное выражение: оригинальный постер не предоставил конкретного ввода, поэтому трудно найти подходящее регулярное выражение.

Редактировать: наконец, оригинальный постер предоставил образец входного файла.

 Apple/One-plus/Samsung/Mi/Sony/_Nokia/ Apple/One-plus/Samsung/Mi/Lenovo/_Nokia/ Apple/One-plus/Samsung/Mi/HTC/OPPO/ 

Регулярное выражение: regex

 regex='\([-[:alpha:]]\+\/\)\{5\}_Nokia\/' 

Альтернативные решения

Эти похожие решения не рекомендуются для начинающих, которые никогда не читали руководство по sed.

 sed -n "/$regex/p;/$regex/d;w input" input.back > output 

Грубо говоря, строки, соответствующие регулярному выражению, сохраняются в output файле, затем они удаляются из соответствующего буфера sed, и содержимое буфера записывается в файл input .

 sed -i.back -e "/$regex/w output" -e "/$regex/d" input 

Эти команды имеют тонкие различия, но вторая удобнее.

Как насчет этого предложения? Это менее краткое предложение, чем ответ @ steeldriver , тем не менее, это прогрессивное решение (шаг за шагом).

 $ cut -d/ -f7 data.txt | grep -n _f | cut -d: -f 1 | xargs -i sed -n {}p data.txt > otherfile.txt 
  • _f – это шаблон, когда создается соответствующий другой файл.

  • data.txt – это ваш файл

  • / это ваш разделитель

Если это сработало, то сделайте comm чтобы выяснить, что должно остаться в исходном файле.

 $ comm -23 data.txt otherfile.txt > remainder.txt 

remainder.txt – это ваш data.txt с удаленными битами.