Python 열거형과 같은 파일의 열 수를 식별하는 방법은 무엇입니까?

Python 열거형과 같은 파일의 열 수를 식별하는 방법은 무엇입니까?

샘플 파일:

11:34:21.590434 IP 10.10.1.30 > 10.10.1.217: ICMP echo reply, id 27948, seq 1, length 64

Python에서는 열거 함수를 사용하여 필드 수를 쉽게 식별할 수 있습니다. 예를 들어

>>> i = '11:34:21.590434 IP 10.10.1.30 > 10.10.1.217: ICMP echo reply, id 27948, seq 1, length 64'
>>> 

문자열 분할

>>> 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

>>> j = i.split()
>>> 

낱낱이 세다

>>> 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를 인쇄하려면 육안으로 수동으로 식별하는 것보다 쉽습니다.

wolf@linux:~$ awk '{print $3}' file.txt 
10.10.1.30
wolf@linux:~$ 

Linux/Bash에서 비슷한 작업을 수행하는 것이 가능하다는 것을 알고 있지만 아직 파악하지 못했습니다.

고쳐 쓰다

나는 다음을 사용하여 열 수를 얻는 것이 쉽다는 것을 알고 있습니다.NF

wolf@linux:~$ awk '{ print NF }' file.txt
14
wolf@linux:~$ 

하지만 여기서 달성하고 싶은 것은 각 열과 해당 번호를 식별하는 것입니다. Python 열거형 출력과 유사할 수 있습니다.

답변1

AWK를 사용하여 필드를 열거할 수 있습니다.

awk '{ for (i = 1; i <= NF; i++) print i, $i }' file.txt

또는 trnl:

tr ' ' '\n' < file.txt | nl

( head -n1첫 번째 행 끝에서 중지를 사용하려면 먼저 필터링하세요 tr. 그렇지 않으면 필드가 여러 행에 걸쳐 계산됩니다.)

Bash 배열을 사용하여 이를 찾을 수도 있습니다(에 따라 다름 IFS).

arr=($(head -n1 file.txt))
i=0
while [[ i -lt ${#arr[@]} ]]; do
    printf "%d %s\n" $((i+1)) "${arr[$i]}"
    ((i++))
done

답변2

다중 문자 RS\s약어 에 GNU awk 사용 [[:space:]]:

$ 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개만 있다고 가정합니다.

답변3

대신에 올바른 해결책이 없다고 생각합니다.스티븐 지터. 하지만 꼭 필요한 경우IP 주소다음을 사용할 수 있습니다.

tr ' ' '\n' <<<'11:34:21.590434 IP 10.10.1.30 > 10.10.1.217: ICMP echo reply, id 27948, seq 1, length 64' | grep IP -A1 | grep -v IP

답변4

솔루션sed

$ sed -n '/1/{s/ /\n/g;p}' < 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
       
$ 

관련 정보