2016-12-21 2 views
0

У меня есть сценарий, который печатает дату с цифрами после того, как он разделен пробелом «» и сохраняет его в файл, файл называется data.txt, и это его содержимое:Добавить переменную в конец каждой строки

21/12/16 18:50 345.44 Mbits/s 
21/12/16 18:52 141.59 Mbits/s 
21/12/16 18:54 85.52 Mbits/s 

Это мой второй сценарий

#!/bin/bash 

for fn in 'cat data.txt'; do 

Speed="$(awk 'BEGIN{FS=" "}{print $3}' Project2.txt)" 
example ="this is an example" 
done 

Этот скрипт может извлечь число «345,44» «141,59» «85,52» из файла. Но теперь я хочу, чтобы добавить «пример» добавить конец каждой строки, как

21/12/16 18:50 345.44 Mbits/s example 
21/12/16 18:52 141.59 Mbits/s example 
21/12/16 18:54 85.52 Mbits/s example 

Как я должен добавить переменную в конец каждой строки? Я буду продолжать взаимодействовать с переменной, потому что я делаю «диаграмму», но мне просто нужно знать, как добавить диаграмму в конец каждой строки в моем файле.

+1

Ваше изменение привело к другой проблеме. Это аннулирует попытки ответить на ваш первоначальный вопрос. Вы должны просто задать новый вопрос. – diametralpitch

+0

Я отредактировал свой ответ, чтобы отразить ваше новое требование. – diametralpitch

+0

Извините за это, awk был полезен, но мне нужно знать, как добавить любую переменную в конец той же строки. –

ответ

0
awk 'BEGIN{FS=" "}{print $3}' filename 

FS выбирает разделитель полей в вашем случае это пространство , то вы выбираете поле «3»

вы можете сохранить вывод в массив

array=$(awk 'BEGIN{FS=" "}{print $3}' filename) 

затем итерацию над ним ,

Чтобы добавить переменную вы объявляете его в AWK, используя опцию -v:

awk -v var=example 'BEGIN{FS=" "}{print $3 " " var}' filename 

это дать и

enter image description here

другой путь

var='example' 

awk 'BEGIN{FS=" "}{print $3 " " "'"$var"'" }' filename 
+0

Спасибо, я отредактировал мой вопрос, можете ли вы помочь мне закончить сценарий? –

+1

Разве вам не понадобилось бы окружать вашу команду awk записью подоболочки, например $ (awk ...), чтобы назначить вывод переменной? – diametralpitch

+0

Пожалуйста [правильно отформатируйте свой код] (http://meta.stackexchange.com/a/22189/248777). – mklement0

0
awk -F " " '{stars=sprintf("%*s", $3, ""); gsub(//, "*", stars); printf("%s %s\n", $0, stars)}' filename 

Вы можете выполнить арифметику, например, деление на $ 3, чтобы увеличить количество звезд, которые вы хотите увидеть.

Примечание: с awk комбинация printf/gsub может быть единственным способом повторного повторения символа.

Редактировать: вы изменили требования к исходному вопросу. Тем не менее, это проще.

awk -F " " '{printf("%s %d\n", $0, $3)}' filename 

Edit: так как изменились требования еще раз ...

awk -F " " '{IntSpeed=sprintf("%d", $3); printf("%s %d\n", $0, IntSpeed)}' filename 

На данный момент, вы можете объединить все эти идеи, чтобы в конечном итоге сделать диаграмму.

+0

Спасибо, я отредактировал мой вопрос, можете ли вы помочь мне закончить сценарий? –

+0

Строка формата внутри оператора printf принимает значение скорости с плавающей запятой в поле 3 и отображает его как целое число. – diametralpitch

+0

Я не понимаю, где вы добавляете переменную $ Intspeed в конец каждой строки. Intspeed - это просто пример, который я буду продолжать взаимодействовать с этой переменной, пока она не станет диаграммой, которую я добавлю в конец каждой строки. –

0
#! /bin/bash 
declare -A speed tab #Associative table 

ilg=0 
while read line 
do 
    set $line 
    speed[$ilg]=$3 
    ilg=$((ilg + 1)) 
done < data.txt 

# your calcul 
l=${#speed[@]} #length of speed 
for ((ilg=0; ilg<$l; ilg++)) 
do 
    Speed=${speed[$ilg]} 
    tab[$ilg]=${Speed%[.]*} 
done 

ilg=0 
while read line 
do 
    echo "$line ${tab[$ilg]}" 
    ilg=$((ilg + 1)) 
done < data.txt 

Тест:

21/12/16 18:50 345.44 Mbits/s 345 
21/12/16 18:52 141.59 Mbits/s 141 
21/12/16 18:54 85.52 Mbits/s 85 
+0

Спасибо, я отредактировал мой вопрос can вы поможете мне закончить сценарий? –

+0

@Lewis Algawari Хорошо, вы должны обновить свой экран. –

+0

Это довольно длинный скрипт. Действительно работает, но я просто хочу знать, как добавить переменную в конец строки в моем foreach loop.Intspeed - это просто пример, который я буду продолжать взаимодействовать с этой переменной, пока не станет диаграммой, которую я добавлю в конец каждой строки. –

0

Вы можете просто попробовать следующее, я надеюсь, каждый раз, когда ваш input_file будет такой же, как показан пример в самом первом посте.

awk -F'[ |/:.]' '{print $0 OFS $6}' Input_file 

Выход будет следующим.

21/12/16 18:50 345.44 Mbits/s 345 
21/12/16 18:52 141.59 Mbits/s 141 
21/12/16 18:54 85.52 Mbits/s 85 
+0

Выбор вашего разделителя полей затрудняет сопоставление номеров полей с данными в файле. Почему в качестве разделителя полей недостаточно одного места? неудобно проходить через все эти проблемы только для разделения частей с плавающей запятой. – diametralpitch

+0

Hello diamertralpitch, У awk есть функция иметь несколько разделителей, чтобы я использовал ее, в случае, если вы хотите увидеть все поля, тогда вы можете попробовать следовать. awk -F '[|/:.]' '{for (i = 1; i <= NF; i ++) {print i, $ i}}' Input_file Вы можете легко увидеть номер поля с полем и можете лучше поймите. Спасибо. – RavinderSingh13