Как отформатировать мой текстовый файл для лучшего внешнего вида?

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 
3
Готовы ли вы использовать 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 

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