Удаление каждой строки в файле из индекса, указанного в другом файле в bash [duplicate]

Также, учитывая DataFrame

data

, как в вашем примере, если вы хотите извлечь только столбцы a и d (ei the 1st и 4-й столбец), iloc mothod из блока данных pandas - это то, что вам нужно, и его можно использовать очень эффективно. Все, что вам нужно знать, это индекс столбцов, которые вы хотите извлечь. Например:

>>> data.iloc[:,[0,3]]

даст вам

          a         d
0  0.883283  0.100975
1  0.614313  0.221731
2  0.438963  0.224361
3  0.466078  0.703347
4  0.955285  0.114033
5  0.268443  0.416996
6  0.613241  0.327548
7  0.370784  0.359159
8  0.692708  0.659410
9  0.806624  0.875476
183
задан Justin Ethier 21 January 2010 в 21:08
поделиться

6 ответов

Если вы хотите удалить строки с 5 по 10 и 12:

sed -e '5,10d;12d' file

Это отобразит результаты на экране. Если вы хотите сохранить результаты в одном файле:

sed -i.bak -e '5,10d;12d' file

Это вернет файл до file.bak и удалит указанные строки.

279
ответ дан Brian Campbell 21 August 2018 в 03:09
поделиться
  • 1
    Не все unixes имеют gnu sed с "-i". Не делайте ошибку, возвращаясь к & gt; sed cmd file & gt; файл ", который уничтожит ваш файл. – pra 22 January 2010 в 07:53
  • 2
    что если бы я хотел удалить 5-ю строчку до последней строки? – Jürgen Paul 11 May 2013 в 04:58
  • 3
    @WearetheWorld sed -e '5,$d' file – Brian Campbell 11 May 2013 в 21:12
  • 4
    @BrianCampbell Что мне делать, чтобы удалить только определенную строку? – Kanagavelu Sugumar 24 April 2014 в 11:56
  • 5
    @KanagaveluSugumar sed -e '5d' file. Синтаксис <address><command>; где <address> может быть либо одной строкой, например 5, либо диапазоном строк, например 5,10, а команда d удаляет данную строку или строки. Адресами могут быть также регулярные выражения или знак доллара $, указывающий последнюю строку файла. – Brian Campbell 24 April 2014 в 15:30

Вы можете удалить определенную одну строку со своим номером строки sed -i '33d' file

. Это приведет к удалению строки на 33 номера строки и сохранению обновленного файла.

21
ответ дан amit 21 August 2018 в 03:09
поделиться

и awk

awk 'NR!~/^(5|10|25)$/' file
25
ответ дан ghostdog74 21 August 2018 в 03:09
поделиться
  • 1
    NB: эта строка awk работает более надежно для меня, чем вариант sed (между OS-X и Ubuntu Linux) – Jay Taylor 23 February 2012 в 21:13
  • 2
    Обратите внимание, что это ничего не удаляет в файле. Он просто печатает файл без этих строк в stdout. Поэтому вам также необходимо перенаправить вывод в файл temp, а затем переместить файл temp для замены оригинала. – mivk 5 June 2015 в 09:00

Я хотел бы предложить обобщение с awk.

Когда файл создается блоками фиксированного размера, а строки для удаления повторяются для каждого блока, awk может работать нормально таким образом

awk '{nl=((NR-1)%2000)+1; if ( (nl<714) || ((nl>1025)&&(nl<1029)) ) print  $0}'
 OriginFile.dat > MyOutputCuttedFile.dat

В этом примере размер для блока - 2000, и я хочу напечатать строки [1..713] и [1026..1029].

  • NR - это переменная, используемая awk для хранения номер текущей строки.
  • % дает остаток (или модуль) деления двух целых чисел:
  • nl=((NR-1)%BLOCKSIZE)+1 Здесь мы пишем переменную nl номер строки внутри текущего блока. (см. ниже)
  • || и && являются логическим оператором ИЛИ и AND .
  • print $0 записывает полную строку

Why ((NR-1)%BLOCKSIZE)+1:
(NR-1) We need a shift of one because 1%3=1, 2%3=2, but 3%3=0.
  +1   We add again 1 because we want to restore the desired order.

+-----+------+----------+------------+
| NR  | NR%3 | (NR-1)%3 | (NR-1)%3+1 |
+-----+------+----------+------------+
|  1  |  1   |    0     |     1      |
|  2  |  2   |    1     |     2      |
|  3  |  0   |    2     |     3      |
|  4  |  1   |    0     |     1      |
+-----+------+----------+------------+

2
ответ дан Hastur 21 August 2018 в 03:09
поделиться
  • 1
    Я восхищаюсь тем, как вы претворяете свое безумное имя. – Jukka Dahlbom 23 April 2015 в 08:09
$ cat foo
1
2
3
4
5
$ sed -e '2d;4d' foo
1
3
5
$ 
15
ответ дан Matthew Slattery 21 August 2018 в 03:09
поделиться

Это очень часто является симптомом антипаттера. Инструмент, который произвел номера строк, вполне может быть заменен на тот, который сразу удаляет строки. Например:

grep -nh error logfile | cut -d: -f1 | deletelines logfile

(где deletelines - полезность, которую вы себе представляете) совпадает с

grep -v error logfile

Сказав это, если вы находитесь в ситуации, когда вам действительно нужно выполнить эту задачу, вы можете создать простой скрипт sed из файла номеров строк. (G3)

sed 's%$%d%' linenumbers

Это принимает файл номеров строк, по одному на строку и производит на стандартном выходе те же номера строк, что и с помощью sed.

sed 's%$%d%' linenumbers

d добавляется после каждого. Это действительный скрипт sed, который мы можем сохранить в файле или (на некоторых платформах) на другой экземпляр sed:

sed 's%$%d%' linenumbers | sed -f - logfile

На некоторых платформах sed -f понимайте параметр option - как стандартный ввод, поэтому вам нужно перенаправить скрипт во временный файл и очистить его, когда вы закончите, или, возможно, заменить одиночную тире на /dev/stdin или /proc/$pid/fd/1, если ваша ОС (или оболочка).

Как всегда, вы можете добавить -i до опции -f, чтобы sed редактировал целевой файл вместо того, чтобы производить результат на стандартном выходе. На * BSDish-платформах (включая OSX) вам необходимо указать явный аргумент -i; общая идиома заключается в предоставлении пустого аргумента; -i ''.

4
ответ дан tripleee 21 August 2018 в 03:09
поделиться
  • 1
    Я не совсем согласен с «симптомом антипаттерна». Типы файлов на основе разметки (например, XML или JSON) требуют определенных строк в конце, чтобы быть допустимыми файлами. В этом случае часто самый разумный подход к удалению этих строк, добавление в файл того, что вы хотите добавить, а затем повторное добавление этих строк, потому что одновременное размещение строк между ними может быть гораздо большим усилием и противоречит потенциальное желание избежать дополнительных инструментов, таких как sed, насколько это возможно. – Egor Hans 12 November 2017 в 13:02
  • 2
    Я не совсем понимаю, какой сценарий вы себе представляете. Там являются сценарии, где это законный подход, но подавляющее большинство случаев, которые я видел, являются новичками, которые более или менее точно демонстрируют мой первый пример. (Возможно, они происходят на каком-то очень низкоуровневом языке и используются для деления их проблемы на уровень молекулярного уровня, потому что вы должны в asm или C.) – tripleee 10 April 2018 в 18:07
  • 3
    Удаление материала по номеру строки из XML или JSON звучит extermely хрупким, если не откровенно опасным. – tripleee 10 April 2018 в 18:08
  • 4
    Что я в основном подразумеваю под этим, так это то, что как создатель такого файла вы знаете, что должно быть в конце документа (т. Е. Набор закрывающих фигурных скобок / квадратных скобок в последних нескольких строках для JSON или точный закрытие тегов для XML). Осознавая это, самый простой подход к расширению такого документа: 1) удалить последние несколько строк, 2) добавить новое содержимое, 3) повторно добавить последние несколько строк. Таким образом, документ может быть действительным как до, так и после его расширения, без необходимости искать способ добавления строк в середине документа. – Egor Hans 20 April 2018 в 14:44
  • 5
    @EgorHans Вы все еще обычно не знаете или не заботитесь о том, какие строки numbers занимают эти строки. Удаление их с помощью регулярного выражения, скорее всего, будет правильным, а также более эффективным; хотя большую часть времени вы должны использовать инструмент, который может правильно обрабатывать тонкости вашего структурированного формата (jq популярен для JSON; xmlstarlet, xsltproc, xmllint, xpath и т. д. доступны для XML). – tripleee 5 May 2018 в 15:32
Другие вопросы по тегам:

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