Прочтение файла CSV

Там пара ошибок.

Во-первых, так как sed использует основные регулярные выражения, то для создания группы захвата необходимо \( и \). Переключатель -r включает расширенные регулярные выражения, поэтому вы не получите ошибку. Смотрите Почему мне нужно экранировать регексные символы в sed для их интерпретации как регексные символы?.

Во-вторых, вы помещаете группу захвата не в то место. Если я вас правильно понял, вы можете это сделать:

sed -e 's!^\(\s*access_log\)[^;]*;!\1 /dev/stdout;!' your_file

Обратите внимание на использование ! в качестве разделителей регрессов, чтобы избежать необходимости избегать прямых косых черт в /dev/stdout.

0
22.07.2014, 06:33
3 ответа

В оригинальном вопросе действительно несколько независимых запросов, но ответ на "какая книга взяла кредит" с помощью awk может выглядеть следующим образом:

cat book.sh 
#!/bin/bash
awk -F"," -v acc=$1 '
{
  for(i=2;i<=NF;i++){
    if($i ~ acc ){
      print $1
    }
  }
}' Books.txt

Что дает нам вывод типа:

$ ./book.sh 4
BOOK1234
BOOK0999
2
28.01.2020, 02:20

Perl - отличный язык обработки текста. Его синтаксис может быть ... удивительным, но его структуры данных чрезвычайно гибкие:

perl -F, -lane '
    $book = shift @F; 
    $books{$book} = [@F]; 
    push @{$users{$_}}, $book for @F; 
} 
END {
    $book="BOOK1234"; 
    printf "book %s has been borrowed %d times, by users %s\n", 
               $book, 
               scalar(@{$books{$book}}), 
               join(",",@{$books{$book}}); 
    $user="1"; 
    printf "user %s has borrowed %d books, %s\n", 
               $user, 
               scalar(@{$users{$user}}), 
               join(",",@{$users{$user}})
' Books.txt
book BOOK1234 has been borrowed 4 times, by users 1,2,3,4
user 1 has borrowed 2 books, BOOK1234,BOOK2334
2
28.01.2020, 02:20

Есть несколько вариантов сделать это

  1. Вы можете grep файл для номера книги, а затем grep для счета

    # grep account books.txt | cut -d "," -f1

    , который выводит это

    BOOK0999

  2. Или вы можете использовать awk, чтобы отфильтровать то, что вам нужно
    awk -F ',' '/9/ { распечатать $1}. ' book.txt

    который выводит это
    BOOK0999

Если бы вы хотели скрипт, вы могли бы сделать это таким образом

#!/bin/bash
acct=$1
while read line; do
    if [[ $line =~ $1 ]]; then
            echo $line | cut -d "," -f1
    fi
done < books.txt

и запустить скрипт с ./скрипт acctno

0
28.01.2020, 02:20

Теги

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