我想格式化我的文本文件以获得更好的外观。所以我需要任何命令或任何 shell 脚本来按照我的期望格式化我的文件。输入文件:
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
答案1
perl。
假设:这个城市只有一个词。
perl -MList::Util=max -lane '
push @num, shift @F;
push @city, pop @F;
push @name, join(" ", @F);
END {
@max = (
max(map {length} @num),
max(map {length} @name),
max(map {length} @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
输出
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
答案2
您需要一些东西来将名称与城市区分开(因为城市可能也有多个单词,大概如此)。所有名称都恰好是两个标记(first+last)吗?如果是这样,您可以假设索引和两部分名称之后的任何内容都是城市名称。下面是一个这样做的例子:
cat new.txt | sed 's/^\(\S\+\)\s/\1~/' | sed 's/^\(\S\+\s\+\S\+\)\s\+\(.*\)$/\1~\2/' | column -s \~ -t
尽管顶部的最后一个标签(城市)必须手动对齐。
答案3
大多数 Linux 系统都运行着 Python。运行此 Python 脚本将获得所需的结果:
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))
我使用了上面原来的前 4 个条目并生成了以下输出文件:
Index Name City
1. Ravi Bhuva Ahmedabad
2. Gaurav Bhuva Rajkot
3. Nimesh Godhasara Junagadh
4. Abhyuday Godhasara Nadiyad