Распечатать переменные оболочки и «» в скрипте awk / sed с использованием echo / printf

#bash #awk #sed #printf #echo

#bash #awk #sed #printf #echo

Вопрос:

Вопрос для распечатки: нам нужно распечатать следующий awk в файл .sh. (Удалите всю строку, содержащую «0» в 12-м столбце)

 awk -F, '$12 != "0"' output.csv >> output2.csv
  

Вот наш скрипт (цикл обращения необходим для другой цели. Это небольшой шаг более крупного скрипта. Предположим, что $ TargetIDs = 123):

 case $TargetIDs in ($P1) echo "awk -F, '$12 != "0"' ${TargetIDs}_output.csv >> ${TargetIDs}_output2.csv" >> output.sh;

(*)  ;;

esac
  

Это выведет следующее в «output.sh «. «$ 1» в «$ 12» исчезает : (

 awk -F, '2 != "0"' 123_output.csv >> 123_output2.csv
  

Мы пробуем массив:

  V="12"

 b=($V)

case $TargetIDs in ($P1) echo "awk -F, '${b[1]} != "0"' ${TargetIDs}_output.csv >> ${TargetIDs}_output2.csv" >> output.sh;

(*)  ;;

esac
  

Это выведет следующее в «output.sh «. 12 долларов исчезают:

     awk -F, ' != 0' output.csv >> output2.csv
  

Второй вопрос аналогичен: мы используем способ sed:

Мы хотим распечатать этот sed:

     sed -i.temp '/"0"/d' 123_output.csv.temp
    mv 123_output.csv.temp 123_output.csv
  

Вот сценарий

     case $TargetIDs in ($P1) printf "sed -i.temp '/"0"/d' ${TargetIDs}_output.csv.tempn mv ${TargetIDs}_output.csv.temp ${TargetIDs}_output.csvn" >> output.sh ;;

    (*)  ;;

    esac
  

Это выведет следующее в «output.sh «:

 sed -i.temp '/0/d' 123_output.csv.temp
mv 123_output.csv.temp 123_output.csv
  

Команда sed становится такой в «output.sh «

 sed -i.temp '/0/d'
  

вместо

 sed -i.temp '/"0"/d'
  

«» исчез в «output.sh » и, следовательно, все строки, имеющие ноль, будут удалены с помощью

 sed -i.temp '/0/d'
  

Интересно, могут ли у гуру быть какие-то решения для этого? Спасибо!

Комментарии:

1. case это не цикл.

Ответ №1:

Попробуйте это:

 echo "awk -F, '$12 != 0' ${TargetIDs}_output.csv >> ${TargetIDs}_output2.csv"
  

Это, конечно, предполагает, что вы обрабатываете столбец 12 как числовое значение.

Комментарии:

1. Просто добавьте «» и проблема решена ?! Удивительно! Могу ли я узнать, что здесь означает «»? Спасибо!

2. @HenrySu Некоторые символы имеют особое значение для оболочки. Один из способов убрать специальное значение — поставить обратную косую черту перед символом. (На самом деле это немного сложнее, см. Цитирование оболочки ). Обратите внимание, что я также удалил двойные кавычки вокруг 0 , поскольку они закончились, и перезапустил вашу строку в двойных кавычках. Если вам нравится этот ответ, обязательно примите его.

Ответ №2:

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

Попробуйте это:

 echo "awk -F, '"'$12 != "0"'"' ${TargetIDs}_output.csv >> ${TargetIDs}_output2.csv"
  

Если TargetIDs может содержать пробелы или метасимволы оболочки, вы также захотите вставить еще несколько кавычек в сгенерированный текст:

 echo "awk -F, '"'$12 != "0"'"' "${TargetIDs}_output.csv" >> "${TargetIDs}_output2.csv""
  

Согласно обсуждению в комментариях, существует разница между:

 awk -F, '$12 != "0"' output.csv >> output2.csv
  

и

 awk -F, '$12 != 0' output.csv >> output2.csv
  

в случае, если это поле 12 00 . Однако ни то, ни другое не является правильным, если вы хотите удалить строки, в которых находится 12-е поле "0" , что, по-видимому, является точкой вашей sed строки во втором вопросе. Для того, чтобы перехватить это, вам нужно:

 awk -F, '$12 != ""0""' output.csv >> output2.csv
  

Убедитесь, что вы используете правильную версию.

Комментарии:

1. Или просто удалите двойные кавычки со всего 0 .

2. @ooga: Проблема в том, что $1 он расширяется. Не имеет никакого отношения к 0. И есть разница между $12 != "0" и $12 != 0 ; первое будет истинным, если $12 есть 00 .

3. Есть ли какой-либо способ принять оба ответа? Оба они такие замечательные и хорошо объясненные!