unix - 文件中的列数

发布于 2024-12-22 22:53:31 字数 344 浏览 1 评论 0原文

给定一个包含这样的数据的文件(即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

Given a file with data like this (i.e. stores.dat file)

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

What would be a command to output the number of column names?

i.e. In the example above it would be 4. (number of pipe characters + 1 in the first line)

I was thinking something like:

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

but it returns all lines instead of just the first and for the first line it returns 1 instead of 4

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(11

池予 2024-12-29 22:53:31
awk -F'|' '{print NF; exit}' stores.dat 

在第一行之后就退出。

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

Just quit right after the first line.

拒绝两难 2024-12-29 22:53:31

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

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

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

This is a workaround (for me: I don't use awk very often):

Display the first row of the file containing the data, replace all pipes with newlines and then count the lines:

$ head -1 stores.dat | tr '|' '\n' | wc -l
夏有森光若流苏 2024-12-29 22:53:31

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

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

Unless you're using spaces in there, you should be able to use | wc -w on the first line.

wc is "Word Count", which simply counts the words in the input file. If you send only one line, it'll tell you the amount of columns.

零度° 2024-12-29 22:53:31

你可以尝试

猫文件| awk '{print NF}'

You could try

cat FILE | awk '{print NF}'

日记撕了你也走了 2024-12-29 22:53:31

Perl 解决方案类似于 Mat 的 awk 解决方案:

perl -F'\|' -lane 'print $#F+1; exit' stores.dat

我已经在具有 1000000 列的文件上对此进行了测试。


如果字段分隔符是空格(一个或多个空格或制表符)而不是竖线:

perl -lane 'print $#F+1; exit' stores.dat

Perl solution similar to Mat's awk solution:

perl -F'\|' -lane 'print $#F+1; exit' stores.dat

I've tested this on a file with 1000000 columns.


If the field separator is whitespace (one or more spaces or tabs) instead of a pipe:

perl -lane 'print $#F+1; exit' stores.dat
莳間冲淡了誓言ζ 2024-12-29 22:53:31

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

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

select any row in the file (in the example below, it's the 2nd row) and count the number of columns, where the delimiter is a space:

sed -n 2p text_file.dat | tr ' ' '\n' | wc -l
征棹 2024-12-29 22:53:31

如果你安装了 python 你可以尝试:

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

If you have python installed you could try:

python -c 'import sys;f=open(sys.argv[1]);print len(f.readline().split("|"))' \
    stores.dat
(り薆情海 2024-12-29 22:53:31

这通常是我用来计算字段数量的方法:

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

This is usually what I use for counting the number of fields:

head -n 1 file.name | awk -F'|' '{print NF; exit}'
一杆小烟枪 2024-12-29 22:53:31

正确的纯 方式

简单地计算

bash 下 文件中的列,您可以简单地:

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

没有分叉,速度更快,并且可以重复使用,因为 $headline 保留完整的标题行。例如,您可以:

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

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

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

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

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

tr -dc 

如果最多有3分隔符,则有4 个字段...或者如果您考虑:

每个分隔符 (|) 前面都有一个Before,后跟一个After,修剪为1逐字逐句:

tr -dc 

计算 CSV 文件中的列数

下,您可以使用csv可加载插件

enable -f /usr/lib/bash/csv csv
IFS= read -r line <file.csv
csv -a fields <<<"$line"
echo ${#fields[@]}
4

有关详细信息,请参阅如何在 Bash 中解析 CSV 文件?

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

如果最多有3分隔符,则有4 个字段...或者如果您考虑:

每个分隔符 (|) 前面都有一个Before,后跟一个After,修剪为1逐字逐句:


计算 CSV 文件中的列数

下,您可以使用csv可加载插件


有关详细信息,请参阅如何在 Bash 中解析 CSV 文件?

\n|' <stores.dat|sed 's/./b&a/g;s/ab/a/g;s/[^ab]//g'|wc -L 4

计算 CSV 文件中的列数

下,您可以使用csv可加载插件

有关详细信息,请参阅如何在 Bash 中解析 CSV 文件?

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

如果最多有3分隔符,则有4 个字段...或者如果您考虑:

每个分隔符 (|) 前面都有一个Before,后跟一个After,修剪为1逐字逐句:

计算 CSV 文件中的列数

下,您可以使用csv可加载插件

有关详细信息,请参阅如何在 Bash 中解析 CSV 文件?

Proper pure way

Simply counting columns in file

Under bash, you could simply:

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

A lot quicker as without forks, and reusable as $headline hold the full head line. You could, for sample:

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

Nota This syntax will drive correctly spaces and others characters in column names.

Alternative: strong binary checking for max columns on each rows

What if some row do contain some extra columns?

This command will search for bigger line, counting separators:

tr -dc 

If there are max 3 separators, then there are 4 fields... Or if you consider:

each separator (|) is prepended by a Before and followed by an After, trimed to 1 letter by word:

tr -dc 

Counting columns in a CSV file

Under , you may use csv loadable plugins:

enable -f /usr/lib/bash/csv csv
IFS= read -r line <file.csv
csv -a fields <<<"$line"
echo ${#fields[@]}
4

For more infos, see How to parse a CSV file in Bash?.

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

If there are max 3 separators, then there are 4 fields... Or if you consider:

each separator (|) is prepended by a Before and followed by an After, trimed to 1 letter by word:


Counting columns in a CSV file

Under , you may use csv loadable plugins:


For more infos, see How to parse a CSV file in Bash?.

\n|' <stores.dat|sed 's/./b&a/g;s/ab/a/g;s/[^ab]//g'|wc -L 4

Counting columns in a CSV file

Under , you may use csv loadable plugins:

For more infos, see How to parse a CSV file in Bash?.

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

If there are max 3 separators, then there are 4 fields... Or if you consider:

each separator (|) is prepended by a Before and followed by an After, trimed to 1 letter by word:

Counting columns in a CSV file

Under , you may use csv loadable plugins:

For more infos, see How to parse a CSV file in Bash?.

坚持沉默 2024-12-29 22:53:31

基于 Cat Kerr 的回应。
该命令适用于solaris

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

Based on Cat Kerr response.
This command is working on solaris

awk '{print NF; exit}' stores.dat
萤火眠眠 2024-12-29 22:53:31

你可以尝试:

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

you may try:

head -1 stores.dat | grep -o \|  | wc -l
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文