Немного 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
Один из способов сделать это — обойти маршрут регулярного выражения и использовать команду чтения 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