Почему awk '{print}' не начинает новую строку, а циклически повторяется на пробелах - PullRequest
0 голосов
/ 30 декабря 2010

У меня есть этот сценарий оболочки

#!/bin/bash

LINES=$(awk '{ print }' filename.txt) 
for LINE in $LINES; do
  echo "$LINE"
done

И filename.txt имеет это содержание

Loreum ipsum dolores 
Loreum perche non se imortale

Сценарий оболочки повторяет все пробелы строк в filename.txt, в то время как предполагается, что он зацикливает только эти две строки.

Но когда я набираю "awk '{print}' filename.txt" в терминале, тогда он зацикливается. Есть объяснения?

Заранее спасибо!

Ответы [ 3 ]

3 голосов
/ 30 декабря 2010

Конструкция $(...) поглощает все выходные данные awk в виде одной большой строки, а затем for LINE in $LINES разделяется на пустое пространство. Вы хотите эту конструкцию вместо:

#! /bin/sh

while read LINE; do
    printf '%s\n' "$LINE"
done < filename.txt
1 голос
/ 30 декабря 2010

Другие ответы хороши, еще одна вещь, которую вы можете сделать, это временно изменить переменную IFS (Внутренний разделитель полей). Если вы обновите свой скрипт оболочки, чтобы он выглядел так:

#!/bin/bash

IFS="
"
LINES=$(awk '{ print }' filename.txt) 
for LINE in $LINES; do
  echo "$LINE"
done

Это обновляет IFS, чтобы он стал новой строкой вместо '', что также должно делать то, что вы хотите.

Просто еще одно предложение.

0 голосов
/ 30 декабря 2010

Вам нужно перебрать LINES как массив, так как все строки хранятся там как массив.

Вот пример, как перебрать строки:

http://tldp.org/LDP/abs/html/arrays.html#SCRIPTARRAY

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