Разобрался. Именованный канал сделал свое дело:
mkfifo fifo
echo "$message" > fifo &
mpack -s "test mail" -d fifo myImage.jpg john@example.com
rm fifo
$ awk -F, '{ print "line " NR; for (i=1;i<=NF;i++) { print "Col " i "="$i } }' input
line 1
Col 1=abc
Col 2=def
Col 3=ghi
line 2
Col 1=abc
Col 2=ghi
line 3
Col 1=def
Col 2=abc
Col 3=ghi
line 4
Col 1=def
Col 2=abc
line 5
Col 1=abc
Col 2=def
line 6
Col 1=abc
Col 2=def
Col 3=ghi
Если вы действительно хотите транслитерировать числовые столбцы в «первый», «второй» и так далее, вы можете определить массив и использовать i
в качестве индекса для поиска слова, соответствующего числу.
С помощью bash можно сделать
ordinals=( first second third fourth fifth sixth )
n=0
while IFS=, read -ra cols; do
echo "line $((++n))"
for i in "${!cols[@]}"; do
echo "${ordinals[i]} col=${cols[i]}"
done
done < file
Это считывает слова в каждой строке в массив с именем cols
, затем мы выполняем интерференцию по индексам этого массива, чтобы мы могли сопоставить значение с порядковым номером.
Для первых 3-х строк получаем
line 1
first col=abc
second col=def
third col=ghi
line 2
first col=abc
second col=ghi
line 3
first col=def
second col=abc
third col=ghi
Предполагая, что входной файл имеет не более трех столбцов, в следующем примере используется циклwhile
-read
для чтения разделенных запятыми -значений из стандартного ввода и вывода их в формате, аналогичном тому, что вы показали:
#!/bin/sh
while IFS=, read -r first second third
do
printf 'Line %d:\n' "$(( ++n ))"
${first:+printf 'First:\t%s\n' "$first"}
${second:+printf 'Second:\t%s\n' "$second"}
${third:+printf 'Third:\t%s\n' "$third"}
done
Расширение параметра ${variable:+word}
расширяется до word
, если variable
установлено и не пусто -. Код использует это для выполнения printf
для вывода, если соответствующая переменная содержит данные для печати.
Тестирование предоставленных данных:
$./script.sh <file
Line 1:
First: abc
Second: def
Third: ghi
Line 2:
First: abc
Second: ghi
Line 3:
First: def
Second: abc
Third: ghi
Line 4:
First: def
Second: abc
Line 5:
First: abc
Second: def
Line 6:
First: abc
Second: def
Third: ghi