unix - 文件中的列数

时间:2011-12-25 11:06:47

标签: linux bash shell unix scripting

给定一个包含这样数据的文件(即stores.dat文件)

sid|storeNo|latitude|longitude
2|1|-28.03720000|153.42921670
9|2|-33.85090000|151.03274200

输出列名数的命令是什么?

即。在上面的示例中,它将是4.(管道字符数+第一行中的1)

我在想这样的事情:

awk '{ FS = "|" } ; { print NF}' stores.dat

但它返回所有行而不是第一行,而第一行则返回1而不是4

10 个答案:

答案 0 :(得分:95)

awk -F'|' '{print NF; exit}' stores.dat 

在第一行之后立即退出。

答案 1 :(得分:34)

这是一种解决方法(对我来说:我不经常使用awk):

显示包含数据的文件的第一行,用换行符替换所有管道,然后计算行数:

$ head -1 stores.dat | tr '|' '\n' | wc -l

答案 2 :(得分:11)

除非您在那里使用空格,否则您应该可以在第一行使用| wc -w

wc是“字数统计”,它只计算输入文件中的单词。如果您只发送一行,它会告诉您列数。

答案 3 :(得分:4)

你可以尝试

  

cat FILE | awk'{print NF}'

答案 4 :(得分:1)

如果您安装了python,可以尝试:

python -c 'import sys;f=open(sys.argv[1]);print len(f.readline().split("|"))' \
    stores.dat

答案 5 :(得分:1)

这通常用于计算字段数:

head -n 1 file.name | awk -F'|' '{print NF; exit}'

答案 6 :(得分:0)

基于Cat Kerr响应。 此命令正在使用solaris

awk '{print NF; exit}' stores.dat

答案 7 :(得分:0)

你可以试试:

head -1 stores.dat | grep -o \|  | wc -l

答案 8 :(得分:0)

选择文件中的任何行(在下面的示例中,它是第2行)并计算列数,其中分隔符是空格:

sed -n 2p text_file.dat | tr ' ' '\n' | wc -l

答案 9 :(得分:0)

正确的方式

在bash下,您可以简单地:

IFS=\| read -ra headline <stores.dat
echo ${#headline[@]}
4

不带分叉一样快得多,并且可以像$headline这样重用,保持完整标题。您可以,例如:

printf " - %s\n" "${headline[@]}"
 - sid
 - storeNo
 - latitude
 - longitude

注意。此语法将正确驱动列名中的空格和其他字符。

替代:对每行的最大列进行强二进制检查

如果某行包含一些额外的列怎么办?

此命令将搜索较大的行,并计算分隔符

tr -dc $'\n|' <stores.dat |wc -L
3

最多有3个分隔符,然后是4个字段。