Как отформатировать мой текстовый файл для лучшего внешнего вида?
302
ravibhuva9955
Я хочу отформатировать текстовый файл для лучшего внешнего вида. Поэтому я хочу любую команду или любой скрипт оболочки, который отформатирует мой файл в соответствии с моими ожиданиями. Входной файл:
Index Name City 1. Ravi Bhuva Ahmedabad 2. Gaurav Bhuva Rajkot 3. Nimesh Godhasara Junagadh 4. Abhyuday Godhasara Nadiyad . . 100. abcd xyz
Выходной файл:
Index Name City 1. Ravi Bhuva Ahmedabad 2. Gaurav Bhuva Rajkot 3. Nimesh Godhasara Junagadh 4. Abhyuday Godhasara Nadiyad . . 100. abcd xyz
Готовы ли вы использовать Microsoft Excel для достижения этой цели?
Garrulinae 9 лет назад
0
Нет, это просто файл new.txt.
ravibhuva9955 9 лет назад
0
Но есть ли у вас Excel? Excel может изменять текстовые файлы. Я отправил ответ ниже, который будет работать.
Garrulinae 9 лет назад
0
Нет, у меня нет Excel и спасибо за быстрый ответ.
ravibhuva9955 9 лет назад
0
Вы не против преобразовать файл `.txt` в файл` .csv` (который может быть лучшим форматом для чего-то подобного)?
joeeey 9 лет назад
0
Это хорошо для обработки, но в конце я хочу файл снова в формате .txt.
ravibhuva9955 9 лет назад
0
Является ли формат даже детерминированным? Если в столбце «Имя» содержится пробел, его необходимо отделить от «Города» чем-то другим, иначе ни один инструмент не сможет надежно его обработать.
Jan Hudec 9 лет назад
1
Все слова разделяются только пробелом.
ravibhuva9955 9 лет назад
0
@ ravibhuva9955: Тогда вам действительно нужно взглянуть на то, что создает файл. И названия городов, и имена людей могут содержать дополнительные слова, и, если нет лучшего разделителя (по крайней мере, вкладки), невозможно разделить их, не зная города.
Jan Hudec 9 лет назад
3
3 ответа на вопрос
4
1337 on Tuesdays
Вам нужно что-то, чтобы отделить названия от городов (поскольку города могут также иметь более одного слова, предположительно). Все ли имена - это два токена (первый + последний)? Если это так, вы можете предположить что-нибудь после индекса, а имя из двух частей - название города. Вот тот, который делает это:
cat new.txt | sed 's/^\(\S\+\)\s/\1~/' | sed 's/^\(\S\+\s\+\S\+\)\s\+\(.*\)$/\1~\2/' | column -s \~ -t
хотя последняя метка сверху (город) должна быть выровнена вручную.
+1 за идею, но исполнение не совсем правильное: `sed -r 's / \ s + / ~ /; s / \ s + (\ S +) $ / ~ \ 1 / 'new.txt | column -s \ ~ -t` - при этом заголовки выравниваются автоматически.
glenn jackman 9 лет назад
0
2
KronoS
Most Linux systems have python running on them. Running this python script will get you the results you're looking for:
line_template = "{:8}\t{:20}\t{}\n" name_template = "{} {}" with open('test.txt') as f: with open('test_new.txt', 'w') as f_new: first_line = f.readline() ind, name, city = first_line.split() f_new.write(line_template.format(ind, name, city)) for line in f: ind, first_name, last_name, city = line.split() name_string = name_template.format(first_name, last_name) f_new.write(line_template.format(ind, name_string, city))
I used you're original first 4 entries above and produced the following output file:
Index Name City 1. Ravi Bhuva Ahmedabad 2. Gaurav Bhuva Rajkot 3. Nimesh Godhasara Junagadh 4. Abhyuday Godhasara Nadiyad
2
glenn jackman
perl.
Assumption: the city only has a single word.
perl -MList::Util=max -lane ' push @num, shift @F; push @city, pop @F; push @name, join(" ", @F); END { @max = ( max(map @num), max(map @name), max(map @city) ); printf "%-*s %-*s %-*s\n", $max[0], $num[$_], $max[1], $name[$_], $max[2], $city[$_] for (0..$#num); } ' <<END Index Name City 1. Ravi Bhuva Ahmedabad 2. Gaurav Bhuva Rajkot 3. Nimesh Godhasara Junagadh 4. Abhyuday Godhasara Nadiyad 42. a b c d e f city 100. abcd xyz END
output
Index Name City 1. Ravi Bhuva Ahmedabad 2. Gaurav Bhuva Rajkot 3. Nimesh Godhasara Junagadh 4. Abhyuday Godhasara Nadiyad 42. a b c d e f city 100. abcd xyz