Извлечь строку файла с левой стороны, но после 2-го разделителя справа - PullRequest
0 голосов
/ 25 сентября 2018

Ниже приведены полные имена файлов.

qwertyuiop.abcdefgh.1234567890.txt
qwertyuiop.1234567890.txt

пытается использовать

awk -F'.' '{print $1}'

Как мне использовать команду awk для извлечения ниже вывода.

qwertyuiop.abcdefgh 
qwertyuiop
Изменить

У меня есть список файлов в каталоге, я пытаюсь извлечь время, размер, владельца, имя файла в отдельные переменные.

для имен файлов.

NAME=$(ls -lrt /tmp/qwertyuiop.1234567890.txt | awk -F'/' '{print $3}' | awk -F'.' '{print $1}')
$ echo $NAME
qwertyuiop
$ 

NAME=$(ls -lrt /tmp/qwertyuiop.abcdefgh.1234567890.txt | awk -F'/' '{print $3}' | awk -F'.' '{print $1}')
$ echo $NAME
qwertyuiop
$ 

ожидается

qwertyuiop.abcdefgh

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

С GNU awk и другими версиями, которые позволяют манипулировать NF

$ awk -F. -v OFS=. '{NF-=2} 1' ip.txt
qwertyuiop.abcdefgh
qwertyuiop
  • NF-=2, эффективно удалят два последних поля
  • 1 - это awkидиома для печати содержимого $0
  • Обратите внимание, что предполагается, что в каждой строке есть как минимум два поля, в противном случае вы получите ошибку


Аналогичная концепция сperl, печатает пустую строку, если число полей в строке меньше 3

$ perl -F'\.' -lane 'print join ".", @F[0..$#F-2]' ip.txt
qwertyuiop.abcdefgh
qwertyuiop


С sed вы можете сохранить строки, если количество полей меньше 3

$ sed 's/\.[^.]*\.[^.]*$//' ip.txt
qwertyuiop.abcdefgh
qwertyuiop
0 голосов
/ 25 сентября 2018

РЕДАКТИРОВАТЬ: Принимая вдохновение из решения Sundeep Sir и добавив следующее в этот микс.

awk 'BEGIN{FS=OFS="."} {$(NF-1)=$NF="";sub(/\.+$/,"")} 1' Input_file

Не могли бы вы попробовать следующее.

awk -F'.' '{for(i=(NF-1);i<=NF;i++){$i=""};sub(/\.+$/,"")} 1' OFS="."  Input_file

ИЛИ

awk 'BEGIN{FS=OFS="."} {for(i=(NF-1);i<=NF;i++){$i=""};sub(/\.+$/,"")} 1' Input_file

Объяснение: Здесь также добавлено объяснение приведенного выше кода.

awk '
BEGIN{                     ##Mentioning BEGIN section of awk program here.
  FS=OFS="."               ##Setting FS and OFS variables for awk to DOT here as per OPs sample Input_file.
}                          ##Closing BEGIN section here.
{
  for(i=(NF-1);i<=NF;i++){ ##Starting for loop from i value from (NF-1) to NF for all lines.
    $i=""                  ##Setting value if respective field to NULL.
  }                        ##Closing for loop block here.
  sub(/\.+$/,"")           ##Substituting all DOTs till end of line with NULL in current line.
}
1                          ##Mentioning 1 here to print edited/non-edited current line here.
'  Input_file              ##Mentioning Input_file name here.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...