Итерация по списку кортежей или имен из текстового файла

Итерация по списку кортежей или имен из текстового файла

У меня есть следующая команда в скрипте Linux.

#!/bin/bash

for i in "001 ARG1" "002 ARG2" "003 ARG3"
do
    set -- $i
    echo $1
    echo $2
done

001 и ARG1 по сути являются кортежами,

Есть ли способ переместить эти кортежи в текстовый файл, который я могу загрузить вместо этого в forloop? так много, что я бы сохранил текстовый файл, как этот

ARG1
ARG2
ARG3

или

001 ARG1
002 ARG2
003 ARG3

И сценарий будет таким

for i in textfile.txt
do
    set -- $i
    echo $1
    echo $2
done

и получить тот же результат?

также есть ли способ сделать так, чтобы 001 002 подсчитывались автоматически? Например, как в python можно установить counter = 0 и counter+=1 и назначить переменную.

решение1

В каждой строке файла даны два слова, разделенные пробелом или табуляцией, как во втором примере входного файла:

while read -r word1 word2; do
    echo "$word1"
    echo "$word2"
done <textfile.txt

Это приведет к считыванию первого слова в каждой строке в $word1, а остальной части строки в $word2.

Входные данные для readзадаются входными данными whileсоставной команды, которая получает их из файла посредством перенаправления.

Параметр -rзапрещает readинтерпретировать этот \символ каким-либо особым образом, если он встречается во входных данных.

По одному слову в строке и счетчику:

counter=0
while read -r word; do
    counter=$(( counter + 1 ))
    echo "$counter"
    echo "$word"
done <textfile.txt

Это увеличит счетчик на единицу в каждой итерации (для каждой строки, считанной из textfile.txt).

Чтобы получить трехзначный счетчик, заполненный нулями, выведите счетчик, используя printfстроку форматирования %.3d\n:

printf '%.3d\n' "$counter"

... на месте echo "$counter".

Описание того, что это %.3d\nзначит, см. в документации функции библиотеки C printf( man 3 printf, эквивалент оболочки использует в основном ту же строку формата).

Связанный контент