Печать вывода awk в той же строке после grep - PullRequest
0 голосов
/ 30 января 2019

У меня есть очень грубый скрипт getinfo.sh, который получает информацию обо всех файлах с именами FILENAME1 и FILENAME2 во всех подпапках и пути к подпапке.Результат awk должен выбирать n-ю строку из FILENAME2 только в том случае, если скрипт вызывается с "getinfo.sh n" .Я хочу, чтобы вся информация была напечатана в одну строку!

Проблема в том, что если я использую print вместо printf, информация записывается в новую строку, но мой скрипт работает.Если я использую printf, я вижу последний бит команды awk в команде propt после того, как сценарий завершен, но он не передается после команды grep в той же строке.В целом вся линия будет довольно длинной, но это намеренно.Не могли бы вы сказать мне, что я делаю не так?

#!/bin/bash

IFS=$'\n'
while read -r fname ;
do
    pushd $(dirname "${fname}") > /dev/null
    printf '%q' "${PWD##*/}"
    grep 'Search_term ' FILENAME1 | tail -1
    awk '{ if(NR==n) printf "%s",$0 }' n=$1 $2 FILENAME2
    popd > /dev/null
done < <(find . -type f -name 'FILENAME1')

Я также был бы счастлив, если бы это было проще, если бы это было проще?

РЕШЕНИЕ:

#!/bin/bash

IFS=$'\n'
while read -r fname ;
do
    pushd $(dirname "${fname}") > /dev/null
   {
     printf '%q' "${PWD##*/}"
     grep 'Search_term' FILENAME1 | tail -1
   } | tr -d '\n'

   if [ "$1" -eq "$1" ] 2>/dev/null
   then
        awk '{ if(NR==n) printf "%s",$0 }' n="$1" FILENAME2
   fi

    printf "\n"
    popd > /dev/null
done < <(find . -type f -name 'FILENAME1')

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Ваша команда показывает неиспользуемый параметр $2, я удалил этот.
Вы можете добавить новую строку в конце awk, используя блок END, но вы также хотите добавить новую строку, когда выпозвоните по вашему сценарию без номера строки.echo будет делать.

#!/bin/bash

IFS=$'\n'
while read -r fname ;
do
   pushd $(dirname "${fname}") > /dev/null
   # Add result of grep in same printf statement
   printf '%s %s' "${PWD##*/}" "$(grep 'Search_term ' FILENAME1 | tail -1)"
   if (( $# -eq 1 )); then
      # use $1 as an awk variable, number n
      # use $2 as a different file to read from
      awk -v n=$1 '{ if(NR==n) printf "%s ",$0 }' FILENAME2
   fi
   # Add line-ending
   echo
   popd > /dev/null
done < <(find . -type f -name 'FILENAME1')
0 голосов
/ 30 января 2019

Вы пояснили это в комментариях.

Я хочу вывод printf '% q' "$ {PWD ## * /}" и grep 'Search_term' FILENAME1 |tail -1 и awk '{if (NR == n) printf "% s", $ 0}' n = $ 1 $ 2 FILENAME2 для печати в одну строку

Итак, во-первых, у нас есть три команды, что каждый выводит одну строку вывода.Поскольку команды не имеют значения, давайте обернем их в функции, чтобы упростить ответ:

cmd1() { printf '%q\n' "${PWD##*/}"; }
cmd2() { grep .... ; }
cmd3() { awk ....; }

Чтобы напечатать их без перевода строки между ними, мы можем:

  1. Использоватьподстановка команды, которая удаляет завершающие пустые символы новой строки.С некоторым printf:

    printf "%s%s%s\n" "$(cmd1)" "$(cmd2)" "$(cmd3)"
    

    или некоторым эхом:

    echo "$(cmd1) $(cmd2) $(cmd3)"
    

    или добавить к переменной:

    str="$(cmd1)"
    str+=" $(cmd2)"
    str+=" $(cmd3)"
    printf" %s\n" "$str"
    

    и т. Д.

  2. Мы можем удалить новые строки из потока, используя tr -d '\n':

    {
         cmd1
         cmd2
         cmd3
    } | tr -d '\n'
    echo # newlines were removed, so add one to the end.
    

    или мы также можем удалить новые строки только из первых команд n-1, но я думаю, что этоменее читабельно:

    {
       cmd1
       cmd2
    } | tr -d'\n'
    cmd3 # the trailing newline will be added by cmd3
    

Если я не передам число, команду awk следует опустить.

Я вижу, что ваша команда awk расширяет как $1, так и $2, и я вижу только $1 для передачи в качестве переменной среды n=$1 в awk.Я не знаю, что такое $2.Вы можете написать if-s для значения $# количества аргументов:

if (($# == 2)); then
    awk '{ if(NR==n) printf "%s",$0 }' n="$1" "$2" FILENAME2
fi

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

...