Транспонирование данных - более простой способ добавления дополнительных столбцов в сценарий Perl

Мое решение может быть немного сложным, но хорошо, кто знает.

Проблема в том, что для этого вам нужно будет подсчитать файлы ... что обычно делается с помощью:

$ ls | wc -l

Теперь, поскольку содержимое записывается в канал, а не в стандартный вывод, это будет требуется немного меньше времени для завершения (запись в терминал занимает немного времени, которое может стать значительным при 400 000 вызовов write (2) ). Это может занять некоторое время, но, тем не менее, вы можете реализовать это с помощью простого теста:

#!/bin/bash

LIMIT=1000
n=$(ls "$@" 2>/dev/null | head -n$LIMIT | wc -l)

if [ $n -ge $LIMIT ]; then
    echo "This directory contains more than $LIMIT entries."
    echo -n "Are you sure want to continue? (y/N) "

    read confirm
    if [ "$confirm" = "y" -o "$confirm" = "Y" ]; then
        exec ls "$@"
    fi
else
    exec ls "$@"
fi

Затем просто установите псевдоним в своем файле .bashrc , чтобы вызвать этот сценарий вместо / bin / ls :

alias ls='/path/to/my_ls.sh --color=auto'

Также убедитесь, что он правильно настроен chmoded:

$ chmod +x /path/to/my_ls.sh

Edit: Я добавил вызов к head , чтобы ls завершалось после $ LIMIT строк вывода. Это должно сэкономить некоторое время (и фактически сделать его лучшим решением, чем тайм-аут );)

Другой подход, который я бы предложил, - использовать тайм-аут. Если ls не завершается, скажем, за 5 секунд, он должен остановиться и спросить вас, уверены ли вы в этом. Вот пример сценария (действителен для нескольких команд, а не только для ls ):

#!/bin/bash                                                                                                                                                                                

TIMEOUT=5

if [ $# -le 0 ]; then
    echo "Usage: $0 [command]"
    exit 1
fi

# Try it silently for a few seconds...
timeout $TIMEOUT "$@" >/dev/null 2>&1

if [ $? -eq 124 ]; then
    echo -n "Your command failed to run under "$TIMEOUT"s. "
    echo -n "Retry without a timeout? (y/N) "

    read confirm
    if [ "$confirm" = "y" -o "$confirm" = "Y" ]; then
        exec "$@"
    fi
else
    exec "$@"
fi

Затем вы можете установить несколько псевдонимов, например:

alias ls='/path/to/script.sh ls --color=auto'
alias grep='/path/to/script.sh grep --color=auto'
alias cat='/path/to/script.sh cat'

Обратите внимание, что я тестирую $? -eq 124 потому что ...

Если время ожидания команды истекло, а - preserve-status не установлен, то выйти со статусом 124.

См. timeout ( 1) для получения дополнительной информации.

1
13.02.2018, 17:13
1 ответ

Prueba esto :Primero, ponlo siempre después del shebanguse strict; use warnings;. Luego, use este bucle for (adapte la lógica a sus necesidades):

foreach my $count (12..2550) {
    if ($line[$count] == 1|0) {
        print OUTPUT_FILE_HANDLE $header[$count]."\t".$orig_line."\n";
    }
}
2
27.01.2020, 23:32

Теги

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