Как распечатать индекс цикла в файл с помощью awk?

Ответ Гленна - это хороший - различие между (...) и {...} важно.

Одна стратегия, которую я часто использую для вывода ошибок, как то, что в вашем вопросе, это команда Tee . Вы можете сделать что-то подобное:

echo "Normal output"
{
  printf "[%s] %s\n" "$(date '+%Y-%m-%d %T')" "Warning text"
  printf "[%s] %s\n" "$(date '+%Y-%m-%d %T')" "This event is logged."
} | tee -a $logfile >&2
echo "More normal output"

Команда Tee отправит вывод в два места; -A Опция «Добавляет» вывод в именованный файл, и команда также будет передавать ввод на stdout. > & 2 > & 2 в конце линейного перенаправления STEE STDOUT для STDERR, которая может обрабатываться по-разному (то есть в работе CRON).

Еще один совет, который я часто использую в сценариях Shell, состоит в том, чтобы изменить поведение отладочной или элбозной вывода на основе того, работает ли скрипт на терминале или имеет вариант -V . Например:

#!/bin/sh

# Set defaults
if [ -t 0 ]; then
  Verbose=true; vflag="-v"
else
  Verbose=false; vflag=""
fi
Debug=false; AskYN=true; Doit=true

# Detect options (altering defaults)
while getopts vdqbn opt; do
  case "$opt" in
    v)  Verbose=true; vflag="-v" ;;             # Verbose mode
    d)  Debug=true; Verbose=true; vflag="-v" ;; # Very Verbose
    q)  Verbose=false; vflag="" ;;              # quiet mode (non-verbose)
    b)  AskYN=false ;;                          # batch mode
    n)  Doit=false ;;                           # test mode
    *)  usage; exit 1 ;;
  esac
done

# Shift our options for further processing
shift $(($OPTIND - 1))

$Verbose && echo "INFO: Verbose output is turned on." >&2
$Debug && echo "INFO: In fact, expect to be overrun." >&2

# Do your thing here
if $AskYN; then
  read -p "Continue? " choice
  case "$choice" in
    Y|y) $Doit && somecommand ;;
    *) echo "Done." ;;
  esac
fi

Сценарии могут начать с чего-то общего, подобного этому на вершине, с Verbose и Debug Explay, разброшенные по всему скрипту. Это просто один способ сделать это - есть много, и разные люди будут иметь свой способ справиться с этим, особенно если они были примерно в то время как. :)

еще один вариант - обрабатывать свой вывод с помощью «обработчика» - функция оболочки, которые могут сделать более умные вещи. Например:

#!/bin/bash

logme() {
  case "${1^^}" in
    [IN]*)  level=notice ;;
    W*)     level=warning ;;
    A*)     level=alert ;;
    E*)     level=emerg ;;
    *)      level=notice ;;
  esac
  if [[ "$#" -eq 1 ]]; then
    # Strip off unnecessary prefixes like "INFO:"
    string="${1#+([A-Z])?(:) }"
  else
    shift
    string="$@"
  fi
  logger -p "${facility}.${level}" -t "$(hostname -s)" "$string"
}

echo "Normal output"
logme INFO "Here we go..."
somecommand | logme
echo "Additional normal output"

(Обратите внимание, что $ {var ^^} - это только Bash.)

Это создает функцию оболочки, которая может использовать функции функций Команда Vogger ) Для отправки вещей в системные журналы. Функция функций logme () может использоваться либо с параметрами, которые генерируют отдельные строки данных журнала, либо с несколькими строками ввода, которые обрабатываются на stdin. Играйте с этим, если кажется привлекательным.

Обратите внимание, что это пример и, вероятно, не должен быть скопирован дословно, если вы не понимаете его и не знаете, что это делает именно то, что вам нужно. Лучшая идея состоит в том, чтобы взять концепции здесь и внести их сами в своих собственных сценариях.

0
18.11.2018, 19:44
3 ответа

Я не уверен, что это ваше требование, но от того, что я вывод ниже, кажется, то, что вам требуется:

awk -v var="$c" '{if (NR < 15 && $8 >0.48 && $8 <0.52 && $9 >0.48 && $9 <0.52 && $10 >0.48 && $10 <0.52) {print var ":" $1 " " $8 " " $9 " " $10}}' RD00$c/MergerHalos.out >> center_raw.dat

-V опция awk используется для передачи значения внешнего переменной Bash внутри awk.

3
28.01.2020, 02:20

Быстрый переписать стилистически (более сухой)

for (( c=sta; c<=end; c++ )); do
    awk -v c=$c '
        NR == 15 {exit}
        function ok(val) {return (0.48 < val && val < 0.52)}
        ok($8) && ok($9) && ok($10) {print c, $1, $8, $9, $10}
    ' RD00$c/MergerHalos.out
done >> center_raw.dat
1
28.01.2020, 02:20

Вы могли бы сделать все это в awk, я думаю

 awk '
 function readfile(i){
    file="RD00"i"/MergerHalos.out"
    while ( (getline < file) > 0) {
    if(NR < 15 && $8 >0.48 && $8 <0.52 && $9 >0.48 && $9 <0.52 && $10 >0.48 && $10 <0.52)
            print i":"$1,$8,$9,$10 > center_raw.dat
        }
        close(file)
}

BEGIN{
    sta=ARGV[1]
    end=ARGV[2]
    ARGC=0
    while(end>sta){print end;readfile(end--)}
}' $start $end

Я думаю, что это может быть излишек, хотя

0
28.01.2020, 02:20

Теги

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