2013-05-11 2 views
-3

Я имею текстовый файл сказать 01-01-2013.txt и имеет содержимое, как показано нижеКак найти количество столбцов в сценарии оболочки?

cat 01-01-2013.txt | cut -d',' -f1-10 | head -6 
 
TIMESTAMP,DATE,HOUR_MINUTE,CAWFM,CSQ2,DBCRIS.CA.MSG,DBI.MSBR.INCOMING.Q,DBI.MSBR.INCOMING.Q.ERROR,DBT.CA.RECEIVE.CUST,DBT.CA.RECEIVE.CUST.ERROR 
20130101000019,01.01.2013,00:00,0,0,0,0,0,6893,31 
20130101000133,01.01.2013,00:01,0,0,0,0,0,6858,31 
20130101000246,01.01.2013,00:02,0,0,0,0,0,6661,31 
20130101000359,01.01.2013,00:03,0,0,0,0,0,6314,31 
20130101000512,01.01.2013,00:05,0,0,0,0,0,6074,31 

Когда я попытался найти число столбцов я использовал ниже команды, и им не получить ожидаемый как показано ниже. его просто возвращается 1

awk 'BEGIN {IFS=","};END{print NF}' 01-01-2013.txt 

Результат

Пожалуйста, помогите мне, чтобы узнать общее число столбцов.

+0

является ли это CSV, что вы хотите знать о столбцах на? Если нет, как вы определяете, что такое столбец? Кроме того, какой ответ вы хотите, если разные строки имеют разные столбцы столбцов? – xaxxon

ответ

0
$ awk '{print NF}' FS=, 01-01-2013.txt 
10 
10 
10 
10 
10 
10 
+0

Hi Steven на самом деле мне нужно удалить первые 2 столбца и скопировать в новый файл –

2

Ваш пример не работает, потому что awk не использует имя IFS, разделитель поля ввода называется FS (но это использовать OFS для разделителя полей на выходе).

$ awk 'BEGIN{FS=","}END{print NF}' csv 
10 

Но вы можете пойти без прочтения всего файла, например. прочитав только первую строку

$ awk -F, 'NR==1{print NF;exit}' csv 
10 

или первую строку, которая соответствует /,/

$ awk -F, '/,/{print NF;exit}' csv 
10 

Если вы хотите, чтобы удалить первые два столбца, я не понимаю, почему вы не придерживаться cut как в вашем вопросе:

$ cut -d, -f3- csv 
HOUR_MINUTE,CAWFM,CSQ2,DBCRIS.CA.MSG,DBI.MSBR.INCOMING.Q,DBI.MSBR.INCOMING.Q.ERROR,DBT.CA.RECEIVE.CUST,DBT.CA.RECEIVE.CUST.ERROR 
00:00,0,0,0,0,0,6893,31 
00:01,0,0,0,0,0,6858,31 
00:02,0,0,0,0,0,6661,31 
00:03,0,0,0,0,0,6314,31 
00:05,0,0,0,0,0,6074,31 
+0

Привет Адриан, Даже я пробовал FS его не работает –

+0

Вы попробовали мои примеры? Но, как сказано, если вы хотите удалить столбцы, не используйте 'awk', а используйте' cut' вместо этого. –

+0

Adrian, Фактически im реализует некоторую логику в моем скрипте, то есть после удаления 2 столбцов мне нужно выяснить сумму других столбцов и необходимость удалить столбцы, которые имеют общее число 0, наконец, должны добавить общее количество в соответствующие столбцы –

0

Чтобы найти не общее нет столбцов:

input_file

TIMESTAMP,DATE,HOUR_MINUTE,CAWFM,CSQ2,DBCRIS.CA.MSG,DBI.MSBR.INCOMING.Q,DBI.MSBR.INCOMING.Q.ERROR,DBT.CA.RECEIVE.CUST,DBT.CA.RECEIVE.CUST.ERROR 
20130101000019,01.01.2013,00:00,0,0,0,0,0,6893,31 
20130101000133,01.01.2013,00:01,0,0,0,0,0,6858,31 
20130101000246,01.01.2013,00:02,0,0,0,0,0,6661,31 
20130101000359,01.01.2013,00:03,0,0,0,0,0,6314,31 
20130101000512,01.01.2013,00:05,0,0,0,0,0,6074,31 

Awk Код

awk 'BEGIN {FS=","} ; END{print NF}' Input_file 

Выход

10 

Perl Решение

#! /usr/bin/perl 

use strict; 
use warnings; 

my @cols = split(',', $_); 
my $n = @cols; 
print "row $. = $n columns\n"; 

Сохраните код как code.pl и выполнить, как

$> perl -n code.pl Input_file 

Perl выход

row 1 = 10 columns 
row 2 = 10 columns 
row 3 = 10 columns 
row 4 = 10 columns 
row 5 = 10 columns 
row 6 = 10 columns