Также, учитывая DataFrame
data
blockquote>, как в вашем примере, если вы хотите извлечь только столбцы 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
Если вы хотите удалить строки с 5 по 10 и 12:
sed -e '5,10d;12d' file
Это отобразит результаты на экране. Если вы хотите сохранить результаты в одном файле:
sed -i.bak -e '5,10d;12d' file
Это вернет файл до file.bak
и удалит указанные строки.
Вы можете удалить определенную одну строку со своим номером строки sed -i '33d' file
. Это приведет к удалению строки на 33 номера строки и сохранению обновленного файла.
Я хотел бы предложить обобщение с 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 |
+-----+------+----------+------------+
$ cat foo
1
2
3
4
5
$ sed -e '2d;4d' foo
1
3
5
$
Это очень часто является симптомом антипаттера. Инструмент, который произвел номера строк, вполне может быть заменен на тот, который сразу удаляет строки. Например:
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 ''
.
jq
популярен для JSON; xmlstarlet
, xsltproc
, xmllint
, xpath
и т. д. доступны для XML).
– tripleee
5 May 2018 в 15:32
sed -e '5,$d' file
– Brian Campbell 11 May 2013 в 21:12sed -e '5d' file
. Синтаксис<address><command>
; где<address>
может быть либо одной строкой, например5
, либо диапазоном строк, например5,10
, а командаd
удаляет данную строку или строки. Адресами могут быть также регулярные выражения или знак доллара$
, указывающий последнюю строку файла. – Brian Campbell 24 April 2014 в 15:30