Почему cut -d ' ' не работает с пробелом в этом случае?

Я могу воспроизвести то, что вы видите, только если я конвертирую b.inpв текстовый файл DOS.

Если вы редактировали файлы в текстовом редакторе Windows или создавали их в системе Windows, то оба они вполне могут быть текстовыми файлами DOS.

Преобразуйте их в текстовые файлы Unix с помощью утилиты dos2unix.

Если b.inpявляется текстовым файлом DOS, код awkбудет включать возврат каретки в конце строк в значении $1в первом блоке. Эти возвраты каретки позже приведут к тому, что $1 in lines(, где $1происходит от a.inp), никогда не будет истинным.

При преобразовании файлов в текстовые файлы Unix ваш код производит

; atom  type      fx      fy      fz
     1     1  1000  1000  1000
5 1 100000 100000 100000
     7     1  1000  1000  1000
    11     1  1000  1000  1000
    12     1  1000  1000  1000
    13     1  1000  1000  1000
15 1 100000 100000 100000
    17     1  1000  1000  1000
    20     1  1000  1000  1000
3
28.08.2020, 01:51
2 ответа

cutвоспринимает каждый разделитель как значимый, даже если есть последовательные пробелы. Это отличается от awk, который по умолчанию разбивается на пробелы, но принимает несколько пробелов только как один разделитель и игнорирует начальные пробелы.

Вы можете заставить awk вести себя аналогично, установив разделитель полей FSна[ ]:

$ ip add show lo | awk -F'[ ]' '$5 == "inet" {print $6}'
127.0.0.1/8

Это должно быть установлено таким образом, как регулярное выражение, так как один пробел в FSобозначает специальную операцию по умолчанию.

См., например,. руководство GNU awk должно сказать о разделителях полей .

11
18.03.2021, 23:09

Строка, которую вы выберете из вывода, начинается с 4 пробелов, если вы выберете пятое поле, вы получите первую строку:

admin:~ # ip address show eth0 | grep 'inet ' | cut -d " " -f 5
inet
5
18.03.2021, 23:09

Теги

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