Как динамически передать имя файла в awk, когда awk используется в подстановке команд для построения массива оболочки? - PullRequest
0 голосов
/ 20 сентября 2009

Вот скрипт, который я использую, и он работает нормально

# This is a test file which we are creating and this will be used to create the shell array
cat > test.txt <<End-of-message
1A|1B|1C|1D
2A|2B|2C|2D
3A|3B|3C|3D
4A|4B|4C|4D
End-of-message

set -A col1_arr `awk 'BEGIN { FS = "|" }{print $1}' test.txt`

i=0
while [ $i -lt ${#col1_arr[@]} ]
do
    echo "Column 1 is:${col1_arr[$i]}"
    (( i=i+1 ))
done

rm test.txt # delet the test file

Я не хочу жестко кодировать test.txt и хочу иметь возможность передавать его как переменную. Пожалуйста, сообщите.

Ответы [ 3 ]

0 голосов
/ 20 сентября 2009

Кажется, вы пытаетесь создать следующий вывод:

Column 1 is: 1A
Column 1 is: 2A
Column 1 is: 3A
Column 1 is: 4A

Если это так, нам не нужна эта длинная и сложная серия команд. Это будет делать:

awk -F'|' '{print "Column 1 is: " $1}' test.txt

Если вы все еще хотите использовать переменную вместо имени файла, установите ее (пример в Bash):

fileName=test.txt
awk -F'|' '{print "Column 1 is: " $1}' $fileName
0 голосов
/ 14 января 2014

Мы можем динамически передавать имя файла в awk независимо от того, используется ли awk в подстановке команд, e. например, если имя файла является первым аргументом скрипта:

... `awk 'BEGIN { FS = "|" }{print $1}' $1`
0 голосов
/ 20 сентября 2009
set -A col1_arr `awk -v file=$myfile -F '|' \
    'END { while (getline < file) print $1 }' /dev/null`

awk перейдет к новой записи, только если основной поток ввода имеет новую запись. Поэтому вы должны выполнить цикл вручную в блоке END и убедиться, что сценарий awk достигает конца блока, указав / dev / null в качестве основного входного потока.

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