2014-11-26 1 views
1

У меня есть awk-скрипт, который дает мне результат, который я хочу в .txt-файле, но моя забота заключается в том, как дается результат: у меня есть все они в одной строке, и я хочу для его разработки.Создайте вывод с помощью скрипта awk или gawk

20140201 -73828274 20140202 7376288374 20140203 3837482437 ....... 20140228 -73629277 

Я хочу, чтобы выход, который будет отображаться в этом формате

20140201   -73828274 
20140202   7376288374 
20140203   3837482437 
n     n 
n     n 
n     n 
20140228   73629277 

Я хочу даты одну сторону и переписывался общей перед датой

Здесь сценарий AWK используется

$ for file in *.txt;do awk -F,'NR==1{header=$0; next} {a[$1]+=$6+$14} END {for (i in a) {print i, a[i]};}' $file; done > red.txt 

ЛЮБАЯ ИДЕЯ?

+0

В основном, как вы печатаете выход. Можете ли вы поделиться сценарием, чтобы мы могли предложить изменения? –

+0

@ KannanMohan Я добавил скрипт –

ответ

1

Вместо print вы можете использовать printf. Изменение END{} часть вашего awk сценария следующим образом:

END {for (i in a) {printf "%d\t%d\n", i, a[i]};} 

Между двумя значениями (%d) печатает вкладку (\t) и в конце перевод строки (\n).

Или ваша полная команда:

for file in *.txt;do awk -F,'NR==1{header=$0; next} {a[$1]+=$6+$14} END {for (i in a) {printf "%d\t%d\n", i, a[i]};}' $file; done > red.txt 
+0

Он отлично работает на оболочке, но при печати в txt-файле у меня все еще есть одна проблема. –

+1

У вас такая же проблема, потому что проблема не имеет ничего общего с вашим awk-скриптом. Это то, что вы делаете, чтобы отображать содержимое вашего файла. –

1

Использование grep и tr, как показано ниже,

$ grep -oP '\S+\s+\S+' file | tr ' ' '\t' 
20140201 -73828274 
20140202 7376288374 
20140203 3837482437 
20140228 -73629277 
0

Ее простой способ сделать это с awk

awk -v RS=" " 'ORS=NR%2?RS:"\n"' file 
20140201 -73828274 
20140202 7376288374 
20140203 3837482437 

Сначала мы ПГТ Селектор записей в пространстве, поэтому каждая дата является новой линия.
Затем мы меняем селектор выходной записи на пробел или новую строку на основе нечетного и четного номера строки.


Вы также можете использовать getline с этим, но будьте осторожны, getline имеет много ловушки.

awk -v RS=" " '{a=$0;getline;print a,$0}' file 
20140201 -73828274 
20140202 7376288374 
20140203 3837482437 

Таким образом, вы можете иметь больший контроль над выходом с помощью printf

+0

Это нормально на раковине! У меня есть проект, который я хочу, но когда я хочу, чтобы этот вывод в txt-файле у меня все еще есть все элементы на одной строке awk -v RS = "" '{a = $ 0; getline; print a, $ 0}' file> output. txt «ЭТО ТАК ИСПОЛЬЗУЕТСЯ СКРИПТ» –

+0

Это нормально, я исправил его :) –

1

Вам не нужен цикл оболочки, AWK вполне способен работать с несколькими файлами, например, с GNU AWK для ENDFILE и удаление массива:

awk -F, 'FNR>1{a[$1]+=$6+$14} ENDFILE{for (i in a) print i, a[i]; delete a}' *.txt > red.txt 

Выше, очевидно, непроверенные, так как вы не предоставили какой-либо ввод пробы.

Сценарий, который вы опубликовали, НЕ МОЖЕТ производить вывод, который вы показываете. Есть что-то еще, что вы делаете после запуска awk-скрипта, чтобы он казался вам, как будто все строки вашего выходного файла находятся в одной строке.Я подозреваю, что вы, вероятно, не цитируя переменную снова (как вы не процитировать $file в сценарии) и делать что-то вроде:

var=$(cat red.txt) 
echo $var 

После того, как ваш скрипт выполняется работает просто сделать cat red.txt и вы увидите, что содержание НЕ ВСЕ на одной линии, как вы утверждаете.

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

  • Нет связанных вопросов^_^