Как правильно заключать переменные в двойные кавычки в команде sed

Немного awk, немного регулярного выражения и убираем пробелы, перенаправляя их кcolumn

awk -F',' '{if ( $4 ~ /[Rr]ead/ &&  $5 > 20 || NR==1) print $5, $9}' data.csv | column -t

Объяснение.... после установки разделителя полей на a с помощью-F','

....если 4-е поле соответствует регулярному выражению ~с «Читать» или «прочитано» и &&5-е поле > 20 или ||мы находимся в первой строке (с заголовки )NR==1, затем распечатайте интересующие вас столбцы......

Просто так

Если вы знаете заголовки столбцов, но ленитесь считать....

Загрузить заголовки в ассоциативный массив

declare -A HEADS=( [mess]=mess [id]=ID [score]=score )

..... awkвывести индексы столбцов из первой строки файла данных в массив

for j in "${!HEADS[@]}"; do HEADS[$j]=$(awk -F',' -v s=${HEADS[$j]} 'NR==1 {for (i=1; i<=NF; ++i) { if ($i ~ s ) print i }}' data.csv) ; done

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

awk -v mess=${HEADS[mess]} -v score=${HEADS[score]} -v id=${HEADS[id]} -F',' '{if ( $mess ~ /[Rr]ead/ &&  $score >20 || NR==1) print $score, $id}' data.csv | column -t
0
09.07.2020, 00:22
1 ответ

Один из способов сделать это — обойти маршрут регулярного выражения и использовать команду чтения rиз sed.

cat 1TBMovie2_dotTSdotMeta.txt | while IFS=, read file moviename; do printf '%s\n' "$moviename" | sed -i -e '2r /dev/stdin' -e '2d' "$file"; done

Оно должно быть записано в нескольких строках, как показано ниже:

cat 1TBMovie2_dotTSdotMeta.txt | 
while IFS=, read file moviename
do
   printf '%s\n' "$moviename" |
   sed -i -e '2r /dev/stdin' -e '2d' "$file"
done

Здесь мы используем функцию gnu sed для чтения файла из stdin. Для не -GNU sedмы можем сохранить имя фильма во временном файле и использовать это имя в команде r. Теперь вам не нужно ничего убегать.

Но если вы не хотите возиться с дополнительным файлом, нам нужно избежать специальных символов / \ &, которые являются специальными в правой части команды sed s/.../.../. /включен, потому что он действует как разделитель.

cat 1TBMovie2_dotTSdotMeta.txt |
while IFS=, read file moviename
do
    moviename_esc=$(printf '%s\n' "$moviename" | sed -e 's:[\&/]:\\&:g')
    sed -i -e "2 s/.*/$moviename_esc/" "$file"
done
1
18.03.2021, 23:21

Теги

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