4.51111111111Rating 4.50 (2 Votes)

Ок, есть файл columns.txt, который содержит мультиколоночную информацию, например:

 1. [✓] org.kde.Platform                                x86_64
 2. [✓] org.freedesktop.Platform.VAAPI.Intel            x86_64
 3. [✓] org.freedesktop.Platform.html5-codecs           x86_64
 4. [✓] org.kde.KStyle.Adwaita                          x86_64
 5. [✓] org.kde.Platform.Locale                         x86_64

Предположим в скрипте нужно выбрать часть колонок и отобразить их, включив например пробел или кавычки в вывод, допустим таким образом:

cat coluumns.txt | awk {'print "\x27"$3" "$4"\x27"'}
'org.kde.Platform x86_64'
'org.freedesktop.Platform.VAAPI.Intel x86_64'
'org.freedesktop.Platform.html5-codecs x86_64'
'org.kde.KStyle.Adwaita x86_64'
'org.kde.Platform.Locale x86_64'

Теперь, допустим, если попробовать прочитать построчно данные непосредственно в bash скрипте из файла методом for, например так:

for i in $(cat columns.txt | awk {'print $3" "$4'}); do
  echo $i
done

То получится следующее:

org.kde.Platform
x86_64
org.freedesktop.Platform.VAAPI.Intel
x86_64
org.freedesktop.Platform.html5-codecs
x86_64
org.kde.KStyle.Adwaita
x86_64
org.kde.Platform.Locale
x86_64

Проблема в том, что при for в каждом элементе $i происходит замена пробелов между словами внутренними разделителем полей, который называется $IFS (Internal Field Separator), вопрос можно решить двумя способами.

Метод №1

Обработать разделитель соотв. способом:

old="$IFS"
IFS='
'
for i in $(cat coluumns.txt | awk {'print "\x27"$3" "$4"\x27"'})
do
   (
   IFS="$old"
   echo "$i"
   )
done

Метод №2

Отправить в файл и прочитать методом while:

cat coluumns.txt | awk {'print "\x27"$3" "$4"\x27"'} > list.txt
while read line
do
   echo $line
done < list.txt

Общий скрипт

#!/bin/bash

# Method 1
old="$IFS"
IFS='
'
for i in $(cat coluumns.txt | awk {'print "\x27"$3" "$4"\x27"'})
do
   (
   IFS="$old"
   echo "Method #1 - $i"
   )
done

# Method 2
cat coluumns.txt | awk {'print "\x27"$3" "$4"\x27"'} > list.txt
while read line
do
   echo "Method #2 - $line"
done < list.txt

 Вывод:

./awk.sh 
Method #1 - 'org.kde.Platform x86_64'
Method #1 - 'org.freedesktop.Platform.VAAPI.Intel x86_64'
Method #1 - 'org.freedesktop.Platform.html5-codecs x86_64'
Method #1 - 'org.kde.KStyle.Adwaita x86_64'
Method #1 - 'org.kde.Platform.Locale x86_64'
Method #2 - 'org.kde.Platform x86_64'
Method #2 - 'org.freedesktop.Platform.VAAPI.Intel x86_64'
Method #2 - 'org.freedesktop.Platform.html5-codecs x86_64'
Method #2 - 'org.kde.KStyle.Adwaita x86_64'
Method #2 - 'org.kde.Platform.Locale x86_64'

 

Добавить комментарий


Защитный код
Обновить

Сейчас один гость и ни одного зарегистрированного пользователя на сайте

Вверх
Вниз