Первая строка вывода awk – это не то, что я ожидаю

Я пытаюсь понять, почему часть имени файла исчезает.

В моем случае я создал три файла

$ ls some-part-of-file.1 some-part-of-file.2 some-part-of-file.3 

и когда я использую awk с FS = "-" , один из них пуст.

 $ ( echo some-part-of-file.1 ; echo some-part-of-file.2 ; echo some-part-of-file.3 ) | awk '{ FS = "-" ; print $0 " " $2}' some-part-of-file.1 some-part-of-file.2 part some-part-of-file.3 part 

Почему some-part-of-file.1 $2 не печатает part как другие?

Вы получаете пустой вывод для первой записи, потому что это уже было прочитано и проанализировано при установке FS .

Вы должны установить разделитель полей перед чтением и анализом входной записи. Таким образом, либо

 awk 'BEGIN{ FS = "-" }{print $2}' 

или

 awk -F'-' '{print $2}' 

В качестве альтернативы вы можете заставить awk повторно проанализировать текущую запись после установки FS :

 awk '{FS = "-"; $0 = $0; print $2}' 

Что касается вашего конвейера, grep не нужен, awk тоже может сделать эту часть:

 ls | awk -F'-' '/some-part-of-file/{print $2}'