Использование NF с FPAT - что я делаю не так?

Предполагая, что ваш ввод небольшой, и имена файлов не содержат пробелов или других странных символов, вы можете просто использовать ls .

ls -dt $(cat files)

$ (cat files) помещает содержимое файлов в командную строку и разбивает их на пробелы, чтобы получить список аргументов. ls -t принимает список файлов в качестве аргументов, сортирует их по времени mtime и выводит на печать. -d необходим, чтобы выводить список каталогов, используя их имена, а не их содержимое.

Если этого недостаточно, вы можете попробовать шаблон декорировать / сортировать / убирать украшения , например

$ while IFS=$'\n' read file; do
    printf '%d %s\n' "$(stat -c +%Y "$file")" "$file"
  done files.sorted

где IFS = $ '\ n' файл чтения; do ... done устанавливает file для каждой записи с разделителями новой строки в files по очереди, printf ... stat ... поворачивается в , sort -k1nr сортирует строки на основе первого поля в обратном числовом порядке, затем вырезать удаляет , оставляя вам только в отсортированном порядке.

1
02.03.2019, 19:47
1 ответ

0. Поздравляю. Кажется, вы нашли ошибку в gawk.

Я сократил это до очень маленького примера. (Возможно, удастся продемонстрировать сбой с более простой строкой FPAT, но мне не хотелось тратить на это еще десять минут. )По сути, для ввода типа foo,barмы можем получить два разных результата.

Случай А:

NF = 2
$1 = foo
$2 = bar
$3 =

и

Случай Б:

NF = 3
$1 = foo
$2 =,
$3 = bar

Этот код создает Случай B:

BEGIN {
        FPAT = "^,|[^,]+"
}

{
        print "NF =", NF
        print "$1 =", $1; print "$2 =", $2; print "$3 =", $3
}

(Я убрал скобки из FPAT, потому что они не нужны; Я удалил часть регулярного выражения, которая обрабатывает строки в кавычках могут содержать запятую (s ), и я сократил код до минимума.)

Используйте

echo foo,bar | awk -f name_of_the_above_awk_script

Но — по крайней мере, в gawk версии 4.1.1 — если я получу доступ к $1до того, как мы получим доступ к NF,тогда я получаю Случай А. Вы можете продемонстрировать это, поменяв порядок операторов print, или этим нелепым клуге:

{
        temp = $1                       # We will never use this.
        print "NF =", NF
        print "$1 =", $1; print "$2 =", $2; print "$3 =", $3
}

Это явно ошибка; невозможно получить доступ к полю должны изменить значения других вещей.

1. Итак, у нас есть работа -.

Просто добавьте temp = $1перед циклом for, и я ожидаю, что вы получите желаемый результат (, используя NF).

2. Настоящее (? )ответ:

В приведенном выше тексте я намеренно избегал упоминаний ни о случае A, ни о случае B. как «правильный» или «неправильный». Вариант А – это то, что вам нужно. но случай B на самом деле может быть правильным результатом для значения FPAT, которое вы используете. Кажется, это говорит о том, что вы хотите, чтобы поле было

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

Но вы не хотите, чтобы запятая была полем; вам просто нужны второй и третий варианты. Я нахожу эту настройку

FPAT = "[^,]+|\"[^\"]+\""

даст вам правильные результаты.

2
27.01.2020, 23:41

Теги

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