2016-11-12 8 views
1

я следующие данные, потенциально распространяться через несколько входных файлов:Сортировка результатов AWK на несколько файлов на основе значения диапазонов

colB1:colB2:colB3:$130.00:... 
colC1:colC2:colC3:$83.00:... 
colD1:colD2:colD3:$80.00:... 

Моя цель состоит в том, чтобы написать первые два столбца из каждой строки ввода в выходной файл, имя которого содержит номер, начинающийся с диапазона $ 10.

Таким образом, для приведенного выше входа, я бы два выходных файла, один с двумя линиями, другой с одним:

balance-80.out 
=== 
colC1:colC2 
colD1:colD2 

balance-130.out 
=== 
colB1:colB2 

Моя текущая попытка выглядит следующим образом:

#!/bin/bash 
for ((value_1=90; value_1<200; value_1+=10)); do 
    awk -F: \ 
    -v var=$value_1 \ 
    -v var1=$((value_1+10)) \ 
    '{ sub(/\$/, "", $4) } 
     ($4+0) >= var && ($4+0) < var1 { print $1":"$2 }' \ 
    *.txt > balance_$value_1.txt 
done 

Это работает, но это, очевидно, очень клочья. Как это можно сделать за один проход?

+1

Почему вы не начать строить MCVE и фиксируя очевидные ошибки, которые * не являются * связаны с 'awk'? Например, '$ value_1 = 90' не присваивает переменной' значение_1' вообще. –

+1

... откровенно говоря, вопрос, с которым вы были связаны как дубликат *, * описывает ошибки, которые присутствуют в вашем скрипте. Если вы исправите эти ошибки и все еще имеете проблемы, то это будет хорошим местом, чтобы помочь вам, но сначала исправьте все другие проблемы, так что ошибка * only *, присутствующая в вашем скрипте, является конкретной ошибкой, должен быть о. –

+0

Что такое MCVE google возвращает программное обеспечение для кредитных карт? – Hopelessone

ответ

3

Несколько моментов:

  • Вы можете создать выходные файлы из awk - и высококачественные awk реализаций Автокэширование дескрипторов файлов, таким образом, сохраняя выходные открытые файлы между отдельными линиями (которые выиграли подобные скрипты» t do)
  • Modulo arithmetic - это подходящий инструмент для выбора имени файла в качестве подходящего ведра для любого заданного значения.

Таким образом:

awk -F: -v min=80 -v max=200 ' 
    { sub(/\$/, "", $4); val = (0 + $4) } 
    val >= min && val < max { 
    print $1 ":" $2 >("balance-" (val - (val % 10)) ".out") 
    } 
' *.txt 
+0

Спасибо, что куча всего Чарльза. Мне стало очень много, чтобы учиться .. – Hopelessone

Смежные вопросы