как изменить запись или разделитель полей файла [закрыто]

Г-н. Ответ Шаллера хорош. Недостатком перенаправления ввода из файла является то, что ваш ручной ввод теперь также зависит от цикла, поэтому пользователи должны будут знать, что нужно нажать Enter (не вводить значение), чтобы завершить цикл. Вы можете использовать свою текущую логику для ручных запусков и сделать что-то вроде ниже, когда есть входной файл ($ 1), предоставленный скрипту (не перенаправленный).

Если вы уверены, что формат файла всегда будет "имя\номер\n", то вы можете сделать:

cntr=0
cat $1 | while read line
do
    if [ $cntr -eq 0 ]
    then
      name=$line
      cntr=1
    elif [ $cntr -eq 1 ]
      number=$line
      echo "Your name is $name and your number is $number"
      cntr=0
    fi
done

Это должно печатать ваше утверждение до тех пор, пока не будут прочитаны все комбинации имя/число.

0
28.05.2016, 18:00
2 ответа

Поведение разделителя записей и полей может быть установлено в определенных программах, таких как awk, и редко выполняется с помощью переменных среды. Обычные утилиты, такие как cat, не имеют такого типа функций: только документированные программы (например, cut) имеют возможности использования различных разделителей записей или полей.

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

FS
Регулярное выражение разделителя полей ввода; a по умолчанию.
OFS
Разделитель полей вывода печатного оператора; по умолчанию.
ORS
Разделитель записей вывода печатного оператора; a по умолчанию.
RS
Первый символ строкового значения RS должен быть разделителем входных записей; a по умолчанию. Если RS содержит более одного символа, результаты не указаны. Если RS равно null, то записи разделяются последовательностями, состоящими из плюс одна или несколько пустых строк, начальные или конечные пустые строки не должны приводить к пустым записям в начале или конце входных данных, а всегда должен быть разделителем полей, независимо от значения FS.

Вы можете установить эти переменные в скрипте, например, ,

awk ' BEGIN { RS=" "; } { print; }' < inputfile

для печати каждого слова файла в новой строке. Вы также можете назначить любую переменную с помощью опции -v:

awk -v  RS=" " '{ print; }' < inputfile

Наконец, awk также имеет опцию -F (разделитель полей ввода), которая совпадает с переменной FS.

Дальнейшее чтение:

4
28.01.2020, 02:20

Если вас интересует только замена символов, вы можете взглянуть на утилиту tr (что означает «перевод»). Например, чтобы преобразовать символы новой строки в пробелы, вы можете использовать:

tr '\n' ' ' < your_input_file

Аналогично, чтобы перевести пробелы в новые строки, используйте:

tr ' ' '\n' < your_input_file

Обратите внимание, что tr читает из stdin , поэтому вам нужно либо использовать перенаправление ввода ( <), как я сделал в этих примерах, или перенаправить туда свой ввод (используя | ).

1
28.01.2020, 02:20

Теги

Похожие вопросы