首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何像Python枚举一样识别文件中的列数?

如何像Python枚举一样识别文件中的列数?
EN

Unix & Linux用户
提问于 2021-01-31 07:58:37
回答 6查看 208关注 0票数 -1

样本文件:

代码语言:javascript
运行
复制
11:34:21.590434 IP 10.10.1.30 > 10.10.1.217: ICMP echo reply, id 27948, seq 1, length 64

在Python中,使用枚举函数很容易识别字段的数量。例如。

代码语言:javascript
运行
复制
>>> i = '11:34:21.590434 IP 10.10.1.30 > 10.10.1.217: ICMP echo reply, id 27948, seq 1, length 64'
>>> 

拆分字符串

代码语言:javascript
运行
复制
>>> i.split()
['11:34:21.590434', 'IP', '10.10.1.30', '>', '10.10.1.217:', 'ICMP', 'echo', 'reply,', 'id', '27948,', 'seq', '1,', 'length', '64']
>>> 

把它放在新变量上,比如说j

代码语言:javascript
运行
复制
>>> j = i.split()
>>> 

枚举它

代码语言:javascript
运行
复制
>>> for i in enumerate(j, 1): i
... 
(1, '11:34:21.590434')
(2, 'IP')
(3, '10.10.1.30')
(4, '>')
(5, '10.10.1.217:')
(6, 'ICMP')
(7, 'echo')
(8, 'reply,')
(9, 'id')
(10, '27948,')
(11, 'seq')
(12, '1,')
(13, 'length')
(14, '64')
>>> 

所以,如果我想打印出带有awk的第3字段的源IP,这是非常容易的,而不是用肉眼手动识别它。

代码语言:javascript
运行
复制
wolf@linux:~$ awk '{print $3}' file.txt 
10.10.1.30
wolf@linux:~$ 

我知道在Linux/Bash中做类似的事情是可能的,我只是还不明白。

<#>更新

我知道使用NF很容易获得列数

代码语言:javascript
运行
复制
wolf@linux:~$ awk '{ print NF }' file.txt
14
wolf@linux:~$ 

但是我在这里想要实现的是识别每一列和它的数字。可能类似于Python枚举输出。

EN

回答 6

Unix & Linux用户

回答已采纳

发布于 2021-01-31 08:11:38

可以使用AWK枚举这些字段:

代码语言:javascript
运行
复制
awk '{ for (i = 1; i <= NF; i++) print i, $i }' file.txt

或者使用trnl

代码语言:javascript
运行
复制
tr ' ' '\n' < file.txt | nl

(如果要在第一行的末尾使用head -n1筛选,则先通过tr进行筛选;否则,将跨行计算字段。)

您还可以使用Bash数组(取决于IFS)找到这一点:

代码语言:javascript
运行
复制
arr=($(head -n1 file.txt))
i=0
while [[ i -lt ${#arr[@]} ]]; do
    printf "%d %s\n" $((i+1)) "${arr[$i]}"
    ((i++))
done
票数 1
EN

Unix & Linux用户

发布于 2021-01-31 15:38:48

用GNU表示多个字符的RS\s[[:space:]]的缩写:

代码语言:javascript
运行
复制
$ awk -v RS='\\s+' '{print NR, $0}' file
1 11:34:21.590434
2 IP
3 10.10.1.30
4 >
5 10.10.1.217:
6 ICMP
7 echo
8 reply,
9 id
10 27948,
11 seq
12 1,
13 length
14 64

它假设你的输入中只有一行,就像你问题中的例子一样。

票数 1
EN

Unix & Linux用户

发布于 2021-01-31 08:30:31

希望这能有所帮助

代码语言:javascript
运行
复制
$ tr ' ' '\n' < file.txt | nl
     1  11:34:21.590434
     2  IP
     3  10.10.1.30
     4  >
     5  10.10.1.217:
     6  ICMP
     7  echo
     8  reply,
     9  id
    10  27948,
    11  seq
    12  1,
    13  length
    14  64
$ 

代码语言:javascript
运行
复制
$ read -ab < file.txt 
$ for c in ${b[*]}; do echo $c; done | nl
     1  11:34:21.590434
     2  IP
     3  10.10.1.30
     4  >
     5  10.10.1.217:
     6  ICMP
     7  echo
     8  reply,
     9  id
    10  27948,
    11  seq
    12  1,
    13  length
    14  64
$ 
票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/631875

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档