Я хочу прочитать части большого CSV-файла между строками n и m и между столбцами p и q. Есть ли простой способ сделать это легко с оболочкой? (Есть ли команды, которые я должен прочитать в документе? В противном случае я напишу скрипт на python)
У меня был скрипт, который я настроил (хорошая идея (N + 1) q часть!) Благодаря комментарию @chronitis и ответу SO :
#! /bin/bash
#
N=10
M=20
P=2
Q=3
sed -n "$N,${M}p; $((M+1))q" $1 | cut -d, -f$P-$Q
Сохраните файл, например, cut_csv
, сделать его исполняемым и использовать как
cut_csv file
Его можно сделать более привлекательным, приняв в качестве входных данных параметры N, M, P, Q и т. д., но я использую его редко, поэтому обычно просто редактируйте файл.
Как это работает :
Основная команда следующая (предположим, N = 10, M = 20, P = 2, Q = 3); оболочка подставляет переменные, и последняя строка становится: (1)
sed -n "10,20p ; 21q" file | cut -d, -f2-3
Давайте начнем с первой команды:
sed -n "10,20p ; 21q" file
Этот вызов sed (потоковый редактор, man sed
) в режиме отсутствия печати (-n
) и выполните в файле следующие команды:
p
) строки между 10 и 20 (это часть 10,20p
) q
) при чтении строки 21 (21q
), так что отбрасывать оставшуюся часть файла Выходные данные sed передаются по конвейеру (|
) в cut
:
cut -d, -f2-3
Эта команда (man cut
) выбирает поля строки (и повторяется для каждой строки). В этом случае я говорю, что разделитель между полями (столбцами) является запятой (-d,
), и распечатывает столбцы между 2 и 3.
В качестве другого более сложного примера я часто использую этот:
sed -n "1p; 10,14p; 21q" data.csv | cut -d, -f1,4-8
Это выберет строку 1 (где у меня есть заголовки :-)) и строки от 10 до 14 (5 строк); затем выберите столбцы 1 (время в моих данных ...) и столбец от 4 до 8. Это действительно очень важно, как только вы овладеете им.
(1) один отличный способ увидеть, что делает оболочка, это изменить первую строку (которая называется шебанг ) следующим образом:
#! /bin/bash -xv
Теперь оболочка будет выведите каждую команду, которую она читает, и результат подстановок:
(0)asus-rmano: part_of_csv.sh p20dedo.csv
#! /bin/bash -xv
#
N=10
+ N=10
M=20
+ M=20
P=2
+ P=2
Q=3
+ Q=3
sed -n "$N,${M}p; $((M+1))q" $1 | cut -d, -f$P-$Q
+ cut -d, -f2-3
+ sed -n '10,20p; 21q' p20dedo.csv
16:05:49,000
16:05:51,000
[...]
Вы можете комбинировать awk и sed с помощью трубы
sed -n '10,50p' file.csv | awk -F ';' '{print $3 $4}'
10 и 50 - ряды.
-F ';' это разделитель полей. (Точка с запятой в моем примере)
$ 3 и $ 4 - это поля для отображения.
Следующий скрипт, использующий head
и tail
, способен печатать часть файла .csv
, отфильтрованную по номеру строки и столбца.
#!/bin/bash
m="$2"
n="$3"
s="$4"
t="$5"
head -n "$n" "$1" | tail -n +"$m" | cut -d, -f "$s"-"$t"
Сохраните приведенный выше скрипт как csv_view.sh
и сделайте его исполняемым.
chmod +x csv_view.sh
где,
m=row number where to begin
n=row number where to end
n=column number where to begin
n=column number where to end
Как использовать
./csv_view.sh mycsvfile.csv 11 32 4 7
Это даст печать строк с 11 по 32 и столбцов с 4 по 7 из mycsvfile.csv