Как определить количество столбцов в файле так же, как перечисление в Python?

Описание изменения является точным, но несколько неясным, поскольку waitобычно рассматривается как ожидание завершения процесса .

Попробуйте это:

sleep 60&
wait %1

затем в другом терминале,

kill -STOP ${pid}

замена ${pid}на sleeppid (в качестве вывода, когда он был переведен в фоновый режим ). waitзавершит работу, так как состояние задания изменилось.

При использовании -fwaitбудет ожидать действительного завершения задания или процесса; использованный выше, он не завершится с kill -STOPи будет ждать возобновления процесса(kill -CONT)и завершения работы.

0
31.01.2021, 10:16
6 ответов

Вы можете перечислить поля с помощью AWK:

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

или с trиnl:

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
1
18.03.2021, 22:33

С помощью GNU awk для multi -char RSи \sсокращение для[[: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
18.03.2021, 22:33

Надеюсь, это поможет

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

или

$ 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
18.03.2021, 22:33

Я догадался, что нет никакого правильного решения, а не Стивен Китт . но если вам нужен только 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
0
18.03.2021, 22:33

Соберите поля и расположите их по одному на строке. Затем пронумеруйте их с помощью параметра grep -n.

echo "....." |
grep -Po  '\S+' | grep -n ^ | sed 's/:/ /'

или

cat file.txt | grep -Po  '\S+' | grep -n ^ | sed 's/:/ /'

Для perls более новой версии, чем 5.14.4

perl -lane '
  while (my($i,$e) = each @F) { print "$i $e"; }
' file.input
0
18.03.2021, 22:33

Решение с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
       
$ 
0
18.03.2021, 22:33

Теги

Похожие вопросы