2

Я использую sed в Linux, пытаясь сопоставить строки данных, имеющие три поля, разделенные табуляцией (но разделение может быть любым пробелом), как в:

 12.3 0a 1b
 15.5 0v 1h
 17.7 5k 3c

; сейчас я использую это:

sed -n 's/^\([^[:blank:]]*\)[[:blank:]]*\([^[:blank:]]*\)[[:blank:]]*\([^[:blank:]]*\)/\1\t\3\t\2/p' mydata.txt

... так что я могу извлекать и манипулировать (в примере, просто инверсией позиции) отдельных полей через \1 , \2 , \3 .

Есть ли лучший способ указать это?

Ура!

1 ответ1

4

Тривиальный пример в awk, чтобы предложить, что можно сделать

awk '{print $2 $1 $3}` < input_file.txt

просто переставляет первые два поля при печати всех трех на всех строках.

Чтобы переставить эти строки, нужно ровно три поля, оставьте те, которые начинаются с # (т. Е. Комментарии на sh-подобных языках), и удалите все остальные.

awk `/^#/{print $0;next} NF==3{print $2 $1 $3;next} {}' < input_file.txt

Большинство систем Unix имеют довольно полную справочную страницу awk.

Это важно для ваших целей здесь, это то, что поля доступны с $1 , $2 , ..., где "поле" определяется как строки материала, разделенные FS (то есть разделителем полей), который по умолчанию равен (пространство).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .