Удалить определенные номера строк (переданные как переменные) из файла в Linux

perl -F'\t' -lane '$,="\t";
   print $_, @F for split /,/, splice @F, 0, 1;
' yourfile

Результаты

Class1  info1   info2   info3   info4
Class2  info1   info2   info3   info4
Class3  info1a  info2a  info3a  info4a
Class4  info1b  info2b1,info2b2 info3b  info4b
Class5  info1b  info2b1,info2b2 info3b  info4b
0
16.06.2016, 14:02
4 ответа

Если список линуксов помещается в памяти (но не обязательно в файле содержимого, как для ed), то можно сделать

awk 'FNR==NR{n[$0];next} !(FNR in n)' Seqfile ContentFile

Если оба файла огромны (или могут быть огромными), а Seqfile отсортирован

cat -n ContentFile | join -v2 -j1 Seqfile - | sed 's/^[0-9]* //'
0
28.01.2020, 02:20

Добавление d до конца каждого числа в файле номеров строк превращает его в сценарий sed , который удаляет указанные строки из своего ввода. Тогда это просто:

$ sed -f lines_to_delete.sed file_with_lines.txt

Скрипт sed можно создать следующим образом:

$ sed -e 's/$/d/' file_with_numbers.txt >lines_to_delete.sed
3
28.01.2020, 02:20

Использование ed :

printf "%s\n" $(printf "%sd\n" $(sort -rnu Seqlist)) w | ed ContentFile

Здесь используется printf для построения списка команд (команды удаления строк из уникального, отсортированного в обратном порядке списка номеров строк из Seqlist, и " w "для записи измененного файла обратно на диск) для ed для использования для редактирования ContentFile

1
28.01.2020, 02:20

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

Самый простой способ исправить это - составить список строк и прогнать их через sed за один раз.

s=
while read a 
do s="$s$a d;"
done < Seqlist 
sed -e "$s" ContentFile  >OUTPUT
0
28.01.2020, 02:20

Теги

Похожие вопросы