Я могу воспроизвести то, что вы видите, только если я конвертирую 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
cut
воспринимает каждый разделитель как значимый, даже если есть последовательные пробелы. Это отличается от awk
, который по умолчанию разбивается на пробелы, но принимает несколько пробелов только как один разделитель и игнорирует начальные пробелы.
Вы можете заставить awk вести себя аналогично, установив разделитель полей FS
на[ ]
:
$ ip add show lo | awk -F'[ ]' '$5 == "inet" {print $6}'
127.0.0.1/8
Это должно быть установлено таким образом, как регулярное выражение, так как один пробел в FS
обозначает специальную операцию по умолчанию.
См., например,. руководство GNU awk должно сказать о разделителях полей .
Строка, которую вы выберете из вывода, начинается с 4 пробелов, если вы выберете пятое поле, вы получите первую строку:
admin:~ # ip address show eth0 | grep 'inet ' | cut -d " " -f 5
inet