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
Если список линуксов помещается в памяти (но не обязательно в файле содержимого, как для ed
), то можно сделать
awk 'FNR==NR{n[$0];next} !(FNR in n)' Seqfile ContentFile
Если оба файла огромны (или могут быть огромными), а Seqfile отсортирован
cat -n ContentFile | join -v2 -j1 Seqfile - | sed 's/^[0-9]* //'
Добавление 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
Использование ed
:
printf "%s\n" $(printf "%sd\n" $(sort -rnu Seqlist)) w | ed ContentFile
Здесь используется printf
для построения списка команд (команды удаления строк из уникального, отсортированного в обратном порядке списка номеров строк из Seqlist, и " w "для записи измененного файла обратно на диск) для ed
для использования для редактирования ContentFile
проблема в том, что ваш скрипт прогоняет весь файл через sed при первом проходе, поэтому ни одно из других чисел не имеет эффекта.
Самый простой способ исправить это - составить список строк и прогнать их через sed за один раз.
s=
while read a
do s="$s$a d;"
done < Seqlist
sed -e "$s" ContentFile >OUTPUT