我在表单上有行
hello world#it#is#a#nice#day
once upon a time...
yes#and#no
good#bye
我想首先对齐 #
- 字符(如果有的话)。如果我做
$ sed 's/#/\t#/1'
在第一个#
之前插入一个标签:
hello world #it#is#a#nice#day
once upon a time...
yes #and#no
good #bye
不是很好!我希望输出更像:
hello world #it#is#a#nice#day
once upon a time...
yes #and#no
good #bye
我想用sed或awk在bash中实现这一点,但无法弄清楚如何。
答案 0 :(得分:2)
我欺骗column
实用程序来执行此操作。您需要一个不在文本中作为标记的角色。我将使用\x01
(二进制1,"标题的开头"在ASCII中)和一个bash shell扩展($'' strings
)来使这个工作,但任何角色都可以作为只要它不在输入数据中。
然后:
sed 's/#/\x01#/' filename | column -t -s $'\x01'
首先将标记放在第一个#
之前,然后使用\x01
作为分隔符对数据进行列表。
答案 1 :(得分:0)
指定两次相同的输入文件,并计算第一轮的最大宽度。一个常见的Awk习语是NR==FNR
,当您处理一组中的第一个文件时(整个行号等于此文件中的行号),这是正确的。
awk -F '#' 'NR==FNR { if (NR==1 || length($1) > max) max=length($1); next }
{ printf "%*s%s\n", -max, $1, substr($0, length($1)+1) }' file file
在*
宽度说明符中使用printf
可能不容易谷歌 - 它说从下一个参数读取宽度(在处理格式字符串时消耗参数)。负宽度是左对齐的(正对可以使右对齐的空间填充)。