Как изменить разделитель в новом файле с помощью awk - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть файл marks.txt, который выглядит так, как он разделен пробелами.

1)  Amit    Physics  80
2)  Rahul   Maths    90
3)  Shyam   Biology  87
4)  Kedar   English  85
5)  Hari    History  89

Я хочу преобразовать разделитель в ",".
Желаемый вывод - это

1),Amit,Physics,80
2),Rahul,Maths,90
3),Shyam,Biology,87
4),Kedar,English,85
5),Hari,History,89

Я обнаружил, что это можно сделать с помощью

awk '$1=$1' FS=" " OFS="," marks.txt

Однако я не понимаю, что означает '$1=$1'.
Кроме того, когда я печатаю

awk '{print}' FS=" " OFS=":" marks.txt>test

или

awk 'BEGIN{OFS=","}1' marks.txt >test

ничего не меняется.Зачем?Большое спасибо.

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Вы можете проверить это самостоятельно, напечатав строки до и после тестирования для него.

awk '{print "BEFORE line-->" $0;$1=$1;print "AFTER line-->" $0}' FS=" " OFS=","  Input_file

Вывод будет следующим:

BEFORE line-->1)  Amit    Physics  80
AFTER line-->1),Amit,Physics,80
BEFORE line-->2)  Rahul   Maths    90
AFTER line-->2),Rahul,Maths,90
BEFORE line-->3)  Shyam   Biology  87
AFTER line-->3),Shyam,Biology,87
BEFORE line-->4)  Kedar   English  85
AFTER line-->4),Kedar,English,85
BEFORE line-->5)  Hari    History  89
AFTER line-->5),Hari,History,89

Таким образом, мы могли видеть, что$1=$1 переоценивает его значение и соответственно изменяет значение всей строки.

Дополнительные пояснения из комментариев: Дело в том, если вы повторно инициируете 1 или 2 доллара илилюбая строка целой строки будет переоценена или перечитана, и тогда будет применено новое значение OFS.Мы пишем это $ 1, мы могли бы написать это $ 2 например -> awk '$2=$2' FS=" " OFS="," Input_file

0 голосов
/ 28 ноября 2018

Если это поможет увидеть его конкретное объяснение в руководстве, вы можете увидеть его здесь: https://www.gnu.org/software/gawk/manual/html_node/Changing-Fields.html

Наконец, бывают случаи, когда удобно заставить awk перестроить весьзапись, используя текущие значения полей и OFS.Чтобы сделать это, используйте, казалось бы, безобидное назначение:

$1 = $1   # force record to be reconstituted 
print $0  # or whatever else with $0 

Это заставит awk перестроить запись.Это действительно помогает добавить комментарий, как мы показали здесь.

Не могу не заметить, что предупреждение автора о включении комментария помогло бы вам здесь!

0 голосов
/ 28 ноября 2018

Назначение $1=$1 - это то, что вызывает повторный анализ полей.Без этого Awk просто передает входные данные на выходные.

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