Добавление числа в столбец [построчно] - PullRequest
1 голос
/ 09 февраля 2020

У меня есть текстовый файл с именем text: строка и столбцы:

1   A   18  -180
2   B   19  -180
3   C   20  -150
50  D   21  -100
128 E   22  -130
10  F   23  -0
10  G   23  -0

Что я хочу сделать, это распечатать 4-й столбец с добавлением постоянного числа к каждой из строк (кроме ==0). Для этого я и сделал.

 #!/bin/bash

FILE="/dir/text"

while IFS= read -r line
do
    echo "$line"
done <"$FILE"

Я могу прочитать четвертый столбец, но в то же время я хочу поставить аргумент $1, который добавит постоянное число ко всем строкам в четвертом столбце, кроме любой строки четвертый столбец имеет ==0.

ОБНОВЛЕНИЕ:

Желаемый вывод будет выглядеть следующим образом: [строки с нулями игнорируются]

-160
-160
-130
-80
-110

Например, имя программы example.sh. Я хочу добавить число в четвертый столбец, используя аргумент. Поэтому это будет:

пример. sh $ 1

, где $ 1 может быть любым числом, которое я хочу добавить в 4-й колонке.

Ответы [ 3 ]

6 голосов
/ 09 февраля 2020

Вы должны awk здесь, что будет быстрее, чем bash.

awk -v number="100" '$4!=0{$4+=number} 1' Input_file

number - это переменная awk, где вы можете установить ее значение в соответствии с вашими потребностями.

Объяснение: Добавление подробного объяснения для приведенного выше кода.

awk -v number="100" '   ##Starting awk program from here and creating a variable number whose value is 100.
$4!=0{                  ##Checking condition if 4th column is NOT zero then do following.
  $4+=number            ##Adding variable number to 4th column here.
}
1                       ##Mentioning 1 will print edited/non-edited lines.
' Input_file            ##mentioning Input_file name here.
3 голосов
/ 09 февраля 2020

Чтобы сохранить форматирование с помощью awk при добавлении значений в 4-е поле, вы можете вычислить новое значение 4-го поля и затем использовать sub, чтобы изменить значение, не вызывая awk для пересчета поля и удаление пробела.

Например, если ваш файл хранится как text и добавляется значение 180 в 4-е поле (кроме случаев, когда 0), вы можете сделать:

awk -v n=180 '$4!=0 {newval=$4+n; sub(/[0-9]+$/,newval)}1' text

В результате получится следующий вывод:

$ awk -v n=180 '$4!=0 {newval=$4+n; sub(/[0-9]+$/,newval)}1' text
1   A   18  0
2   B   19  0
3   C   20  30
50  D   21  80
128 E   22  50
10  F   23  -0
10  G   23  -0

При вызове с использованием сценария оболочки вы можете передать свой параметр $1 как:

awk -v n="$1" '$4!=0 {newval=$4+n; sub(/[0-9]+$/,newval)}1' text

Хотя Я бы посоветовал проверить, что в сценарий был передан аргумент:

[ -z "$1" ] && {
    echo "error: value require as argument"
    exit 1
}

или вы можете указать значение по умолчанию - до вас.

1 голос
/ 09 февраля 2020

С bash:

while read -ra a; do [[ ${a[3]} != -0 ]] && ((a[3]+=42)); echo "${a[@]}"; done < file

Выход:

1 A 18 -138
2 B 19 -138
3 C 20 -108
50 D 21 -58
128 E 22 -88
10 F 23 -0
10 G 23 -0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...