Linux SHELL скрипт, читайте каждую строку за разное количество столбцов - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть файл и, например, значения в нем:

1 value1.1 value1.2
2 value2.1
3 value3.1 value3.2 value3.3

Мне нужно прочитать значения, используя скрипт оболочки, но количество столбцов в каждой строке разное !!! Я знаю, что если, например, я хочу прочитать второй столбец, я сделаю это так (для номера строки в качестве входного параметра)

$ awk -v key=1 '$1 == key { print $2 }' input.txt
value1.1

Но, как я уже говорил, количество столбцов в каждой строке разное. Как сделать это чтение динамическим?

Например: если входной параметр равен 1, это означает, что я должен читать столбцы из первой строки, поэтому вывод должен быть

value1.1 value1.2

если входной параметр равен 2, это означает, что я должен читать столбцы из второй строки, поэтому вывод должен быть

value2.1

если входной параметр равен 3, это означает, что я должен читать столбцы из третьей строки, поэтому вывод должен быть

value3.1 value3.2 value3.2

Дело в том, что число столбцов не является статичным, и я должен читать столбцы из этой конкретной строки до конца строки.

Спасибо

1 Ответ

0 голосов
/ 13 ноября 2018

Тогда вы можете просто сказать:

awk -v key=1 'NR==key' input.txt

ОБНОВЛЕНО

Если вы хотите обработать данные столбца, будет несколько способов.
С помощью awk вы можете сказать что-то вроде:

awk -v key=3 'NR==key {
    for (i=1; i<=NF; i++)
        printf "column %d = %s\n", i, $i
}' input.txt

, который выдает:

column 1 = value3.1
column 2 = value3.2
column 3 = value3.2

В awk вы можете получить доступ к каждому значению столбца с помощью $1, $2, $3 напрямую или $i косвенно , где переменная i содержит 1, 2, 3.

Если вы предпочитаете использовать bash, попробуйте что-то вроде:

line=$(awk -v key=3 'NR==key' input.txt)
set -- $line    # split into columns

for ((i=1; i<=$#; i++)); do
    echo column $i = ${!i}
done

, который выдает те же результаты.
В bash косвенный доступ немного сложен, и вам нужно сказать ${!i}, где i - имя переменной.

Надеюсь, это поможет.

...