如何使用sed或awk来对齐第一次出现的符号

时间:2015-09-08 09:46:08

标签: text replace awk sed gawk

我在表单上有行

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中实现这一点,但无法弄清楚如何。

2 个答案:

答案 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可能不容易谷歌 - 它说从下一个参数读取宽度(在处理格式字符串时消耗参数)。负宽度是左对齐的(正对可以使右对齐的空间填充)。