-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。错误
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

结果

1

请帮我找出列的总数。

4

3 回答 3

2

您的示例不起作用,因为awk不使用 name 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
于 2013-05-11T07:30:11.503 回答
0
$ awk '{print NF}' FS=, 01-01-2013.txt
10
10
10
10
10
10
于 2013-05-11T07:14:57.077 回答
0

要查找总列数:

输入文件

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
于 2013-05-11T16:22:23.810 回答