#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. Есть ли какой-либо способ принять оба ответа? Оба они такие замечательные и хорошо объясненные!