прочитать столбец из файла, увеличить каждый элемент на постоянную, а затем переписать обратно в файл в bash - PullRequest
0 голосов
/ 18 марта 2020

Я попытался прочитать столбец из файла, увеличить каждый элемент на константу, а затем переписать обратно в файл в bash. Например, столбец

1  
2  
3  
4  

Я хочу переписать их обратно как

5  
6  
7  
8

Я попробовал следующее, это работает. Мне интересно, есть ли более простые способы без l oop в bash.

n=( $(awk '{print $1}' ./test) )  
len=${#n[*]}   

for (( i=0; i<=$(( $len -1 )); i++ ))  
do  
    n[$i]=$((${n[$i]} + 2000))  
done  
echo ${n[*]} > test2  

Ответы [ 2 ]

3 голосов
/ 18 марта 2020

В вашем примере вы увеличиваете на 4. Это можно легко сделать в awk, как это.

awk '{print $1 + 2000}'  < test > test2

Демо:

$ echo "1  
2  
3  
4 "  | awk '{print $1 + 4}' 
5
6
7
8
$
1 голос
/ 18 марта 2020

Вы можете попробовать прочитать l oop, используя чисто решение оболочки.

constant=4
while read -r line; do
  printf '%d\n' $((line + constant))
done < <(awk '{print $1}' file.txt ) > out.txt

Оболочка может обработать первый столбец без awk, сохранив каждую строку в массиве, который требует использования -a флаг / опция для read

constant=4
while read -ra line; do
   printf '%d\n' $((line + constant))
done <  file.txt > out.txt
  • "$line" совпадает с ${line[0]}", который является первым элементом в массиве.

  • $ можно опустить внутри арифметического / математического контекста внутри $(( ))

или просто выполнить расширение параметра.

constant=4
while read -r line; do
  printf '%d\n' $((${line%%[[:space:]]*} + constant))
done <  file.txt > out.txt

РЕДАКТИРОВАТЬ: Как предполагает ogus ismail, встроенная read может иметь фиктивную переменную, которая может содержать остальные столбцы / поля (так как мы ищем только первое поле / столбец), который является _.

constant=4
while read -r column1 _ ; do
  printf '%d\n' $((column1 + constant))
done <  file.txt > out.txt
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...