2015-02-06 2 views
1

Мне было интересно, как я буду писать это в оболочке? Я хочу проверить поле в файле csv coulmn с помощью coulmn. Например только хочу, чтобы проверить, если номер coulmn один номерСкрипт оболочки для проверки столбца файла csv по столбцу

Number,Letter 

1,u 
2,h 
3,d 
4,j 

выше

Loop - for all files (loop1) 

loop from rows(2-n) (loop2) #skipping first row since its a header 

    validate column 1 

    validate column 2 

    ... 

    end loop2 
      if(file pass validation) 
       copy to goodFile directory 
      else(
       send to badFile directory 


end loop1 

То, что я здесь ниже строки с помощью проверки строк, какие изменения я должен был бы сделать это, как выше код psuedo, который у меня выше. Я ужасен в unix, только что начал узнавать об awk.

#!/bin/sh 

for file in /source/*.csv 

do 
    awk -F"," '{      # awk -F", " {'print$2'} to get the  fields. 
$date_regex = '~(0[1-9]|1[012])[- /.](0[1-9]|[12][0-9]|3[01])[- /.](19|20)\d\d~'; 

if (length($1) == "") 
    break 
if (length($2) == "") && (length($2) > 30) 
    break 
if (length($3) == "") && ($3 !~ /$date_regex/) 
    break 
if (length($4) == "") && (($4 != "S") || ($4 != "E") 
    break 
if (length($5) == "") && ((length($5) < 9 || (length($5) > 11))) 
    break 



}' file 

    #whatever you need with "$file" 

сделано

+0

Есть некоторые особенности причина, это должно быть сделано как сценарий оболочки, а не в каком-то другом языке? Если вы лучше на python или perl или что-то, что вы могли бы написать в этом. – zstewart

+0

должны выполнить это в оболочке грустно:/ –

+0

Я не вижу, как эти типы операторов могут выполняться ... 'if (length ($ 5) ==" ") && ((length ($ 5) <9 .. . длина должна возвращать 0 или положительное число вправо? Да, '==" "' вероятно, будет true, когда lenth = 0, но тогда зачем тестировать, если 'length ($ 5) <9'? Также задание, подобное' $ date_regex = ... 'No' $ 'для имен переменных LHS для назначений. И почему' break', почему бы не 'printf (« ошибка в строке% s »для col # =% d, value =% s ', NR, 5, 5 долларов). Удачи. – shellter

ответ

1

Я буду комбинировать два разных способа написать цикл. Строки, начинающиеся с # Комментарий:

# Read all files. I hope no file have spaces in their names 
for file in /source/*.csv ; do 
    # init two variables before processing a new file 
    FILESTATUS=GOOD 
    FIRSTROW=true 
    # process file 1 line a time, splitting the line by the 
    # Internal Field Sep , 
    cat "${file}" | while IFS=, read field1 field2; do 
     # Skip first line, the header row 
     if [ "${FIRSTROW}" = "true" ]; then 
     FIRSTROW=FALSE 
     # skip processing of this line, continue with next record 
     continue; 
     fi 

     # Lot of different checks possible here 
     # Can google them easy (check field integer) 
     if [[ "${field1}" = somestringprefix* ]]; then 
     ${FILESTATUS}=BAD 
     # Stop inner loop 
     break 
     fi 
     somecheckonField2 
    done 
    if [ ${FILESTATUS} = "GOOD" ] ; then 
     mv ${file} /source/good 
    else 
     mv ${file} /source/bad 
    fi 
done 
1

Предполагая, что ни один пробел в файле, вот как я бы это сделать в Баш.

# validate: first field is an integer 
# validate: 2nd field is a lower-case letter 

for file in *.csv; do 
    good=true 
    while IFS=, read -ra fields; do 
     if [[ ! ( 
        ${fields[0]} =~ ^[+-]?[[:digit:]]+$ 
        && ${fields[1]} == [a-z] 
       ) ]] 
     then 
      good=false 
      break 
     fi 
    done < "$file" 
    if $good; then 
     : # handle good file 
    else 
     : # handle bad file 
    fi 
done 
Смежные вопросы