Выбор диапазона столбца в bash с помощью цикла while - PullRequest
1 голос
/ 12 февраля 2020

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

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

Если мы хотим перебирать строку за строкой, используя время l oop, это будет:

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
140 F 23 -0

То, что произошло в приведенной выше строке, добавляет 42 в каждую строку 4-го столбца, кроме случаев, когда есть 0.

Как я могу выбрать количество диапазонов столбцов, используя 1-й столбец? Например, я хочу выбрать только 2 to 50 из первого столбца, что означает, что я хочу печатать только 2nd, 3rd and 4th столбцов. Следовательно, результат будет

2 B 19 -138
3 C 20 -108
50 D 21 -58

Ответы [ 2 ]

3 голосов
/ 12 февраля 2020

1-е решение: Если вы хотите напечатать только те строки, которые удовлетворяют условию, и выполнять операции только над ними, попробуйте выполнить следующее.

awk '$1>=2 && $1<=50{$4+=42;print}'  Input_file

Почему awk? потому что это будет быстрее и является очевидным выбором по сравнению с использованием bash или любой оболочки l oop для обработки файла здесь.



2-е решение: Если OP хочет делать только в оболочке, можно попробовать следующее.

while read first second third fourth
do
   if [[ "$first" -ge 2 && "$first" -le 50 ]]
   then
        echo "$first $second $third $((fourth+42))"
   fi
done < "Input_file"

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

2 B 19 -138
3 C 20 -108
50 D 21 -58
0 голосов
/ 12 февраля 2020

Sed вариант

sed -n "/^2 /,/^50 /p" file

эта команда sed означает печать (p) всех строк между шаблонами '^ 2' и '^ 50', включая строки с соответствием шаблону, символ '^' обозначает начало линия.

или вы можете использовать расширение скобки с sed

for i in {2..50}; { sed -n "/^$i /p" file; }

или с grep

for i in {2..50}; { grep "^$i " file; }

Это довольно медленно, но очень просто для понимания , запомни и используй.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...