Извлечение части массивного CSV-файла из командной строки

Я хочу прочитать части большого CSV-файла между строками n и m и между столбцами p и q. Есть ли простой способ сделать это легко с оболочкой? (Есть ли команды, которые я должен прочитать в документе? В противном случае я напишу скрипт на python)

2
задан 12 February 2014 в 19:34

3 ответа

У меня был скрипт, который я настроил (хорошая идея (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) и выполните в файле следующие команды:

  1. напечатайте (p) строки между 10 и 20 (это часть 10,20p)
  2. выходить (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
[...]
0
ответ дан 12 February 2014 в 19:34

Вы можете комбинировать awk и sed с помощью трубы

sed -n '10,50p' file.csv | awk -F ';' '{print $3 $4}'

10 и 50 - ряды.

-F ';' это разделитель полей. (Точка с запятой в моем примере)

$ 3 и $ 4 - это поля для отображения.

0
ответ дан 12 February 2014 в 19:34

Следующий скрипт, использующий 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

0
ответ дан 12 February 2014 в 19:34

Другие вопросы по тегам:

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