#bash #row
#bash #строка
Вопрос:
Допустим, у меня есть большой файл с большим количеством строк и столбцов. Я хотел бы узнать, сколько строк и столбцов у меня есть с помощью bash.
Комментарии:
1. приведите пример ввода и ожидаемого результата
2. Извините, я не очень хорошо знаком с bash. В R это выглядело бы примерно как dim (ввод), который возвращал бы два числа, #rows и #cols.
3. фактический входной файл может выглядеть следующим образом: «blah tdata tdatatdatatdatanblah2tdatatdatatdatatdatan»
4. Я надеялся, что может быть элегантный способ сделать это с помощью какой-нибудь встроенной функции… возможно, что-то вроде wc?
Ответ №1:
Столбцы: awk '{print NF}' file | sort -nu | tail -n 1
Используйте head -n 1
для наименьшего количества столбцов, tail -n 1
для наибольшего количества столбцов.
Строки: cat file | wc -l
или wc -l < file
для группы UUOC.
Комментарии:
1. @Tim: Опечатка, должно быть
<
очевидно. Я бы сделал это не так, но это удовлетворяет пользователей UUOC (cat
улучшает читаемость IMO, и я предпочитаю это менее читаемым каналам, особенно при ответе на вопросы новичков)2. @Erik Вы также можете выполнить команду «< file wc -l» и поместить перенаправление перед командой для улучшения удобства чтения. (Хотя, в этом случае я не уверен, почему вы просто не создаете «wc -l file»)
3. Нет необходимости в сортировке или хвосте, просто сделайте все это в awk: awk ‘{if( NF> max ) max = NF} END {print max}’
4. Как здесь указать разделитель, например, если файл разделен табуляцией
5. @Joy:
awk -F't' '{print NF}' file | sort -nu | tail -n 1
использовать табуляцию в качестве разделителя
Ответ №2:
В качестве альтернативы для подсчета столбцов, подсчитайте разделители между столбцами. Я считаю, что это хороший баланс краткости и легкости запоминания. Конечно, это не сработает, если ваши данные содержат разделитель столбцов.
head -n1 myfile.txt | grep -o " " | wc -l
Используется head -n1
для захвата первой строки файла.
Использует grep -o
to для подсчета всех пробелов и вывода каждого найденного пробела в новой строке. Используется wc -l
для подсчета количества строк.
РЕДАКТИРОВАТЬ: Как указывает Гаурав Тули ниже, я забыл упомянуть, что вы должны мысленно добавить 1 к результату или иным образом записать эту математику.
Комментарии:
1. количество столбцов в CSV будет
head -n1 myfile.txt | grep -o "," | wc -l
1, потому что grep подсчитывает количество запятых (или любого другого разделителя столбцов), но количество столбцов будет на 1 больше этого.
Ответ №3:
Если ваш файл большой, но вы уверены, что количество столбцов остается неизменным для каждой строки (и у вас нет заголовка), используйте:
head -n 1 FILE | awk '{print NF}'
чтобы найти количество столбцов, где FILE — это ваше имя файла.
Для определения количества строк будет работать ‘wc -l FILE’.
Комментарии:
1. Или просто
awk '{print NF; exit}'
.
Ответ №4:
Небольшой поворот к ответу kirill_igum, и вы можете легко подсчитать количество столбцов любой определенной строки, которую вы хотите, вот почему я пришел к этому вопросу, хотя вопрос задается для всего файла. (Хотя, если в вашем файле одинаковые столбцы в каждой строке, это, конечно, тоже работает):
head -2 file |tail -1 |tr 't' 'n' |wc -l
Выдает количество столбцов в строке 2.
Замените 2 на 55, например, чтобы получить его для строки 55.
-bash-4.2$ cat file
1 2 3
1 2 3 4
1 2
1 2 3 4 5
-bash-4.2$ head -1 file |tail -1 |tr 't' 'n' |wc -l
3
-bash-4.2$ head -4 file |tail -1 |tr 't' 'n' |wc -l
5
Приведенный выше код работает, если ваш файл разделен табуляциями, поскольку мы определяем его как «tr». Если в вашем файле есть другой разделитель, скажем, запятые, вы все равно можете посчитать свои «столбцы», используя тот же трюк, просто изменив символ разделителя «t» на «,»:
-bash-4.2$ cat csvfile
1,2,3,4
1,2
1,2,3,4,5
-bash-4.2$ head -2 csvfile |tail -1 |tr ',' 'n' |wc -l
2
Ответ №5:
Для строк вы можете просто использовать wc -l file
-l
расшифровывается как общая строка
для столбцов вы можете просто использовать head -1 file | tr ";" "n" | wc -l
Объяснение
head -1 file
Захват первой строки вашего файла, которая должна быть заголовками, и отправка ее следующему cmd через канал
| tr ";" "n"
tr
расшифровывается как translate.
Это переведет все ;
символы в символ новой строки.
В этом примере ;
это ваш разделитель.
Затем он отправляет данные в следующую команду.
wc -l
Подсчитывает общее количество строк.
Ответ №6:
Вы можете использовать bash. Примечание для очень больших файлов в гигабайтах используйте awk/wc
. Однако производительность все равно должна быть приемлемой для файлов размером в несколько МБ.
declare -i count=0
while read
do
((count ))
done < file
echo "line count: $count"
Ответ №7:
Если подсчета количества столбцов в первом достаточно, попробуйте следующее:
awk -F't' '{print NF; exit}' myBigFile.tsv
где t
находится разделитель столбцов.
Ответ №8:
awk 'BEGIN{FS=","}END{print "COLUMN NO: "NF " ROWS NO: "NR}' file
Вы можете использовать любой разделитель в качестве разделителя полей и можете найти номера СТРОК и столбцов
Комментарии:
1. как можно поместить это в качестве
alias
? Я пробовал разные способы, но это выдает ошибки. Возможно, связано с' "
.
Ответ №9:
Простое количество строк — это $(wc -l "$file")
. Используйте $(wc -lL "$file")
для отображения как количества строк, так и количества символов в самой длинной строке.
Комментарии:
1. Верно. Глупо с моей стороны было предполагать, что это очевидно:
wc -l file |cut -f 1
.2. @Tim Sylvester: Вы знаете, что UUOC — это потерянный процесс, верно? Я испытываю искушение передать его вам обратно для этого
cut
😉3. Как это можно потратить впустую, если вы хотите, чтобы имя файла было удалено из выходных данных? Есть ли неизвестный мне способ заставить
wc
не печатать имя файла?4. Ах, при использовании stdin не отображается имя файла. <headsmack> Теперь я чувствую себя глупо.
Ответ №10:
head -1 file.tsv |head -1 train.tsv |tr 't' 'n' |wc -l
возьмите первую строку, измените табуляцию (или вы можете использовать ‘,’ вместо ‘t’ для запятых), подсчитайте количество строк.
Ответ №11:
Решение на Perl:
perl -ane '$maxc = $#F if $#F > $maxc; END{$maxc ; print "max columns: $maxcnrows: $.n"}' file
Если ваш входной файл разделен запятыми:
perl -F, -ane '$maxc = $#F if $#F > $maxc; END{$maxc ; print "max columns: $maxcnrows: $.n"}' file
вывод:
max columns: 5
rows: 2
-a
автоматическое разделение входной строки на @F
массив
$#F
равно ли количество столбцов -1
-F,
разделитель полей вместо пробела
$.
это номер строки (количество строк)
Ответ №12:
Очень простой способ подсчета столбцов первой строки в чистом bash (без awk, perl или других языков):
read -r line < $input_file
ncols=`echo $line | wc -w`
Это сработает, если ваши данные отформатированы соответствующим образом.
Ответ №13:
Следующий код выполнит эту работу и позволит вам указать разделитель полей. Это особенно полезно для файлов, содержащих более 20 тысяч строк.
awk 'BEGIN {
FS="|";
min=10000;
}
{
if( NF > max ) max = NF;
if( NF < min ) min = NF;
}
END {
print "Max=" max;
print "Min=" min;
} ' myPipeDelimitedFile.dat