LINUX.ORG.RU

Загвоздка при смене столбцов

 ,


0

2

Всем доброго времени суток. Имеется файл вида:

0001 имя
0002 имя2
0003 имя3
Нужно поменять местами столбцы и привести к виду:
имя 0001
имя2 0002
имя3 0003
Немного умею в awk, поэтому смастерил:
awk '!/^#/{print $2,$1}/^#/' file.txt > file2.txt
Проблема в том, что ничего не меняется. Пробую на тестовом файле в несколько строк с двумя столбцами - все ок. Пробую на основном - ноль эмоций. Где я ошибся, подскажите. Да, еще один важный момент, в котором наверное и вся соль. Я пробую смотреть структуру основного файла через head или cat и вижу ровные колонки без нарушений. Но если чекнуть КВ в тоталкомандере на окнах, то выходит такая структура:
имя
0001 имя2
0002
имя3 
0003 имя4

Может sed попробовать?

sed -r 's/^(\S*)(\s*)(\S*)$/\3\2\1/g' 

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 2)
Ответ на: комментарий от anonymous

NF > 1 { .. } наверное лучше, а то пробел может добавить

anonymous
()

Забавно видеть попытки подсказать, как разобрать файл с какой-то хитрой структурой, не видя, что́ же там за структура такая.

RenardL, я это ваше «чекнуть КВ в тоталкомандере на окнах» не понимаю, но очевидно, что если вы хотите услышать что-нибудь осмысленное, то надо привести фрагмент файла как он есть — в двоичном виде, ну или если негде опубликовать бинарник, то в виде дампа.

Zmicier ★★★★★
()
Ответ на: комментарий от Zmicier

Моя команда должна работать с любыми извратами, так как полностью сохраняет структуру строки. Разве что в исходном файле есть строки где более одного кластера пробельных символов.

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 2)
Ответ на: комментарий от Xenius

Xenius, получилось так:

0000
4aklas
0001
4aklas
0002
4aklas
0003
4aklas
0004
4aklas
Анонимус с awk:
 4aklas
0000
 4aklas
0001
 4aklas
0002
 4aklas
0003
 4aklas
0004
 4aklas
0005

Zmicier, вы правы. Вот кусок файла. http://rgho.st/private/84rDJzVTj/5b8defded2b495ab66011c9e6fedf505 https://www.virustotal.com/ru/file/b859e492b0465ea0be16f993dd7f43a731289a2085...

RenardL
() автор топика
Ответ на: комментарий от RenardL

Всё просто, там нету концов строк, вместо них переводы каретки. так что просто можно сделать так:

cat file1.txt | tr \\r \\n | sed -r 's/^(\S*)(\s*)(\S*)$/\3\2\1/g' > file2.txt

Видимо файл откуда-то со старого макинтоша.

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 4)
Ответ на: комментарий от Xenius

Это не макинтош, это послу xargs -L 2 такое... Все выровнялось как надо и столбцы поменялись. Очень признателен вам за помощь. Спасибо.

RenardL
() автор топика
Ответ на: комментарий от RenardL

Вариант с одной командой вместо отдельной tr:

sed -re 'y/\r/\n/;s/^(\S*)(\s*)(\S*)$/\3\2\1/gm'

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 1)
Ответ на: комментарий от Zmicier

А если снять write-only, то: :-)

Мне мой вариант понятнее. Конструкция !/^#/ например без вдумчивого чтения мана awk сильно неочевидна...

Кстати вот так сохраняется даже извратный перевод строки:

sed -re 's/(\S*)(\s*)(\S*)(\n|$|\r)/\3\2\1\4/g'

Xenius ★★★★★
()
Последнее исправление: Xenius (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.