2015-10-10 4 views
1

У меня есть несколько файлов tsv, и я хочу проверить, что каждый файл правильно отформатирован. Прежде всего, я хочу проверить, что каждая строка имеет правильное количество столбцов. Есть ли способ сделать это? Мне бы понравилось решение командной строки, если оно есть.проверка того, что строки в файле имеют одинаковое количество столбцов

ответ

1
awk '{print NF}' test | sort -nu | head -n 1 

Это дает вам самое низкое число столбцов в файле в любой строке.

awk '{print NF}' test | sort -nu | tail -n 1 

Это дает вам наибольшее количество столбцов в файле в любой строке. Результат должен быть таким же, если присутствуют все столбцы.

Примечание: это дает мне ошибку на OS X, но не на Debian ... возможно, используется gawk.

+0

Мне это нравится, мне нужно было очень близко к этому: – kmace

+0

awk '{print NF}' test | sort -nu | wc -l и убедитесь, что он равен 1 – kmace

1

(я предполагаю, что «ЦВ», вы имеете в виду файл, столбцы разделены символами табуляции.)

Вы можете сделать это просто с AWK, до тех пор, пока файл не процитировали поля, содержащие символы табуляции.

Если вы знаете, сколько столбцов вы ожидаете, следующие будут работать:

awk -F '\t' -v NCOLS=42 'NF!=NCOLS{printf "Wrong number of columns at line %d\n", NR}' 

(Конечно, вы должны изменить 42 правильное значение.)

Можно также автоматически выбрать до количества столбцов из первой строки:

awk -F '\t' 'NR==1{NCOLS=NF};NF!=NCOLS{printf "Wrong number of columns at line %d\n", NR}' 

Это будет работать (с большим количеством шума), если первая строка содержит неверное число столбцов, но не сможет обнаружить файл, где все линии имеют одинаковое количество столбцов. Таким образом, вам, вероятно, будет лучше с первой версией, которая заставит вас указать количество столбцов.

0

awk является хорошим кандидатом на это. Если столбцы разделяются табуляцией (я думаю, это то, что tsv значит), и если вы знаете, сколько из них вы должны иметь, скажем, 17, вы можете попробовать:

awk -F'\t' 'NF != 17 {print}' file.tsv 

Это будет печатать все строки в file.tsv что не имеет точно разделенных 17 разделов. Если мое предположение неверно, отредактируйте свой вопрос и добавьте недостающую информацию (разделители столбцов, количество столбцов ...). Обратите внимание, что формат tsvcsv) сложнее, чем кажется. Поля могут содержать разделитель полей, записи могут охватывать несколько строк ... Если это ваш случай, не пытайтесь изобретать колесо и использовать существующий парсер tsv.

1

Просто очистки @snd ответ выше:

number_uniq_row_lengths=`awk '{print NF}' $pclFile | sort -nu | wc -l` 
if [ $number_uniq_row_lengths -eq 1 ] 2>/dev/null; then 
    echo "$pclFile is clean" 
fi 
2

Добавление этого здесь, потому что эти ответы были близки, но не совсем работа для меня, в моем случае, мне нужно, чтобы указать разделитель полей для AWK.

Следующее должно возвращаться с одной строкой, содержащей число столбцов (если каждая строка имеет одинаковое количество столбцов).

$ awk -F'\t' '{print NF}' test.tsv | sort -nu 
8 
  • -F используется для указания разделитель полей для AWK
  • NF это число полей
  • -nu заказов граф поля для каждой строки численно и возвращает только уникальные,

Если вы получили больше одной строки, то есть несколько строк вашего .tsv с большим количеством столбцов, чем другие.

Чтобы проверить правильность форматирования .tsv с каждой строкой с одинаковым количеством полей, следующее должно возвращать 1 (как прокомментировано kmace на принятом ответе), однако мне нужно было добавить -F '\ t'

$ awk -F'\t' '{print NF}' test.tsv | sort -nu | wc -l 
Смежные вопросы