Unix 如何在shell脚本中查找列数?

Unix 如何在shell脚本中查找列数?,unix,csv,awk,Unix,Csv,Awk,我有一个文本文件说01-01-2013.txt,它的内容如下 cat 01-01-2013.txt | cut -d',' -f1-10 | head -6 结果 一, 请帮助我找出列的总数。您的示例不起作用,因为awk不使用名称IFS,输入字段分隔符称为FS,但它使用OFS作为输出字段分隔符 $ awk '{print NF}' FS=, 01-01-2013.txt 10 10 10 10 10 10 $ awk 'BEGIN{FS=","}END{print NF}' csv 10

我有一个文本文件说01-01-2013.txt,它的内容如下

cat 01-01-2013.txt | cut -d',' -f1-10 | head -6
结果

一,


请帮助我找出列的总数。

您的示例不起作用,因为awk不使用名称IFS,输入字段分隔符称为FS,但它使用OFS作为输出字段分隔符

$ awk '{print NF}' FS=, 01-01-2013.txt
10
10
10
10
10
10
$ awk 'BEGIN{FS=","}END{print NF}' csv
10
但是您可以不读取整个文件,例如只读取第一行

$ awk -F, 'NR==1{print NF;exit}' csv
10
或匹配/,的第一行/

如果你只想删除前两列,我不明白你为什么不坚持你的问题中的cut-like:

$ 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

要查找列的总数,请执行以下操作:

输入文件

Awk代码

输出

Perl解决方案

将代码另存为code.pl并作为

$> perl -n code.pl Input_file
Perl输出


这是一个CSV,你想知道有关列的信息吗?如果不是,您如何定义列是什么?另外,如果不同的行具有不同的列计数,您想要什么答案?嗨,Steven,实际上我需要删除前2列并复制到新文件。您尝试过我的示例吗?但正如前面所说,如果你想删除列,不要使用awk,而是使用cut。Adrian,实际上,我在脚本中实现了一些逻辑,即在删除了2列之后,我需要找出其他列的总和,需要删除总计为0的列,最后需要将总计添加到相应的列上。你难道不喜欢我想做X这样的问题吗?当你告诉他们如何做X时,他们实际上会说,我想做Y。我想知道他们在想什么…@EdMorton事实上,情况更糟。请参见史蒂文回答中先前的评论。这更像是我想做X…不,等等,我想做Y。我是说Z。。。。
$ awk -F, '/,/{print NF;exit}' csv
10
$ 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
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 'BEGIN {FS=","} ; END{print NF}' Input_file
10
#! /usr/bin/perl

use strict;
use warnings;

my @cols = split(',', $_);
my $n = @cols;
print "row $. =  $n columns\n";
$> perl -n code.pl Input_file
row 1 =  10 columns
row 2 =  10 columns
row 3 =  10 columns
row 4 =  10 columns
row 5 =  10 columns
row 6 =  10 columns