Как искать / заменять кучу текстовых файлов в unix (osx) - PullRequest
4 голосов
/ 27 июня 2011

У меня есть регулярное выражение, которое я успешно протестировал на http://regexpal.com/:

^(\".+?\"),\d.+?,"X",-99,-99,-99,-99,-99,-99,-99,(\d*),(\d*)

Где мои тестовые данные выглядят так:

"AB101AA",10,"X",-99,-99,-99,-99,-99,-99,-99,394251,806376,179,"S00","SN9","00","QA","MH","X"
"AB101AF",10,"X",-99,-99,-99,-99,-99,-99,-99,394181,806429,179,"S00","SN9","00","QA","MH","X"
"AB101AG",10,"X",-99,-99,-99,-99,-99,-99,-99,394251,806376,179,"S00","SN9","00","QA","MH","X"
"AB101AH",10,"X",-99,-99,-99,-99,-99,-99,-99,394371,806359,179,"S00","SN9","00","QA","MH","X"
"AB101AJ",10,"X",-99,-99,-99,-99,-99,-99,-99,394171,806398,179,"S00","SN9","00","QA","MH","X"
"AB101AL",10,"X",-99,-99,-99,-99,-99,-99,-99,394331,806530,179,"S00","SN9","00","QA","MH","X"

Я хочу заменить его на \1,\2,\3 в каждой строке, поэтому, например, строка 1 выдаст

"AB101AA",394251,806376

Как я могу запустить поиск и замену регулярных выражений по всем файлам csv в моей папке в osx? Я пытался использовать sed, но он жалуется на синтаксическую ошибку (плюс я не уверен, что он будет поддерживать это регулярное выражение?). Кроме того, будут ли якоря ^ (начало строки) и $ (конец строки) работать построчно или они будут совпадать с началом и концом файла?

ОБНОВЛЕНИЕ: Некоторые хорошие ответы с cut, awk ect, которые получают определенные поля из csv, но я недавно узнал, что мне нужно взять числа из этого списка и разделить их на 2 под-значения, так что мой пример выводит из выше должно выглядеть примерно так:

"AB101AA",3,94251,8,06376

Насколько я знаю, для этого мне нужно использовать регулярное выражение.

Ответы [ 3 ]

5 голосов
/ 27 июня 2011

Вы хотели бы извлечь поля 1, 11 и 12? Для такой задачи awk или cut действительно превосходны! Например.

awk -F, '{print $1, $11, $12}' input

с использованием cut:

cut -d, -f1,11,12 input 

с использованием perl. -a включает режим автоматического разделения - perl автоматически разбивает входные строки на пробелах в массив @F. -F используется вместе с -a, чтобы выбрать разделитель, по которому нужно разделить строки.

perl -F, -lane 'printf "%s, %d, %d\n", $F[0], $F[10], $F[11]' input 

... и, наконец, чистое решение bash

#!/bin/bash
IFS=,
while read -ra ARRAY;
do
    echo ${ARRAY[0]}, ${ARRAY[10]}, ${ARRAY[11]}
done < input
3 голосов
/ 27 июня 2011
for file in *csv; do
    cp $file "${file}.bak && \
    awk -F "," 'BEGIN OFS=","} {print $1,$11,$12}' ${file}.bak > ${file}
done

Или

sed -i.bak 's/^\("[^"]\+"\),\d\+,"X",-99,-99,-99,-99,-99,-99,-99,\([0-9]\+\),\([0-9]\+\)/\1,\2,\3/' FILE(S)

Например:

$ sed 's/^\("[^"]\+"\),[0-9]\+,"X",-99,-99,-99,-99,-99,-99,-99,\([0-9]\+\),\([0-9]\+\).*/\1,\2,\3/' <<EOF                                                   
"AB101AA",10,"X",-99,-99,-99,-99,-99,-99,-99,394251,806376,179,"S00","SN9","00","QA","MH","X"       
"AB101AF",10,"X",-99,-99,-99,-99,-99,-99,-99,394181,806429,179,"S00","SN9","00","QA","MH","X"
"AB101AG",10,"X",-99,-99,-99,-99,-99,-99,-99,394251,806376,179,"S00","SN9","00","QA","MH","X"
"AB101AH",10,"X",-99,-99,-99,-99,-99,-99,-99,394371,806359,179,"S00","SN9","00","QA","MH","X"
"AB101AJ",10,"X",-99,-99,-99,-99,-99,-99,-99,394171,806398,179,"S00","SN9","00","QA","MH","X"
"AB101AL",10,"X",-99,-99,-99,-99,-99,-99,-99,394331,806530,179,"S00","SN9","00","QA","MH","X"
EOF   
"AB101AA",394251,806376
"AB101AF",394181,806429
"AB101AG",394251,806376
"AB101AH",394371,806359
"AB101AJ",394171,806398
"AB101AL",394331,806530
$   

HTH

0 голосов
/ 27 июня 2011
cd folder
for file in $(find . -type f -name '*.csv')
do
    echo $file
    awk -F"," '{printf("%s,%s,%s\n", $1, $11, $12)}' $file > /tmp/${file}.$$
    #awk -F"," '/^(\".+?\"),[0-9]+?,"X",-99,-99,-99,-99,-99,-99,-99,([0-9]+),([0-9]+)/ {printf("%s,%s,%s\n", $1, $11, $12)}' $file > /tmp/${file}.$$
    #mv /tmp/${file}.$$ ${file}
done

Прокомментируйте первый awk и раскомментируйте второй awk, если вам нужен регулярный опыт. Раскомментируйте последний mv после тестирования.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...