下面是一个员工列表,每个员工的信息存储在文件emp.lst中:
2233|a.k. shukla|g.m.|sales|12/12/52|6000
9876|jai sharma|director|production|12/03/50|7000
5678|sumith chakrobarty|d.g.m.|marketing|19/04/43|6000
2365|barun sengupta|director|personnel|11/05/47|7800
5423|n.k. gupta|chairman|admin|30/08/56|5400
1006|chanchal singhvi|director|sales|03/09/38|6700
6213|karuna ganguly|g.m|accounts|05/06/62|6300
1265|s.n. dasgupta|manager|sales|12/09/63|5600
4290|jayant Choudhary|executive|production|07/09/50|6000
2476|anil aggarwal|manager|sales|01/05/59|5000
6521|lalit chowdury|director|marketing|26/09/45|8200
3212|shyam saksena|d.g.m.|accounts|12/12/55|6000
3564|sudhir Agarwal|executive|personnel|06/07/47|7500
2345|j.b. saxena|g.m|marketing|12/03/45|8000
0110|v.k. agarwal|g.m|marketing|31/12/40|9000
我想对齐这些信息,以便每个字段的开头(其中字段分隔符为'|'或管道)从相同的列号开始。示例:所有名称从第6列开始存储,其他字段也是如此。我找到的一个解决方案是使用printf,而不是print。Printf可以格式化输出。在这里,我发现可以在打印时为每个字段保留固定数量的空格。例如:
$ awk 'BEGIN{ FS="|"; OFS="|" }1 { printf "%4s %20s %10s %10s %8s %sn", $1, $2, $3, $4, $5, $6}' emp.lst
现在,为第一个字段保留4个空格,为第二个字段保留20个,为第三个字段保留10个,等等。这工作得很好。以下是我在终端上写入上述命令时得到的输出:
2233 a.k. shukla g.m. sales 12/12/52 6000
9876 jai sharma director production 12/03/50 7000
5678 sumith chakrobarty d.g.m. marketing 19/04/43 6000
2365 barun sengupta director personnel 11/05/47 7800
5423 n.k. gupta chairman admin 30/08/56 5400
1006 chanchal singhvi director sales 03/09/38 6700
6213 karuna ganguly g.m accounts 05/06/62 6300
1265 s.n. dasgupta manager sales 12/09/63 5600
4290 jayant Choudhary executive production 07/09/50 6000
2476 anil aggarwal manager sales 01/05/59 5000
6521 lalit chowdury director marketing 26/09/45 8200
3212 shyam saksena d.g.m. accounts 12/12/55 6000
3564 sudhir Agarwal executive personnel 06/07/47 7500
2345 j.b. saxena g.m marketing 12/03/45 8000
0110 v.k. agarwal g.m marketing 31/12/40 9000
现在一切都很好,除了字段不再被分隔符"|"分隔,我如何保留分隔符为"|"?我从这里猜想的是,在上面的命令中,由于某种原因,内置变量OFS不起作用:
OFS = " | "
当您使用printf
时,OFS
的设置变为no-op。您必须在printf
语句中显式地放置分隔符。例如:
$ awk -F'|' '{printf "%4s|%20s|%10s|%10s|%8s|%sn", $1, $2, $3, $4, $5, $6}' file
2233| a.k. shukla| g.m.| sales|12/12/52|6000
9876| jai sharma| director|production|12/03/50|7000
5678| sumith chakrobarty| d.g.m.| marketing|19/04/43|6000
2365| barun sengupta| director| personnel|11/05/47|7800
5423| n.k. gupta| chairman| admin|30/08/56|5400
1006| chanchal singhvi| director| sales|03/09/38|6700
6213| karuna ganguly| g.m| accounts|05/06/62|6300
1265| s.n. dasgupta| manager| sales|12/09/63|5600
4290| jayant Choudhary| executive|production|07/09/50|6000
2476| anil aggarwal| manager| sales|01/05/59|5000
6521| lalit chowdury| director| marketing|26/09/45|8200
3212| shyam saksena| d.g.m.| accounts|12/12/55|6000
3564| sudhir Agarwal| executive| personnel|06/07/47|7500
2345| j.b. saxena| g.m| marketing|12/03/45|8000
0110| v.k. agarwal| g.m| marketing|31/12/40|9000
您可以使用column命令:
$ column -s '|' -t file
2233 a.k. shukla g.m. sales 12/12/52 6000
9876 jai sharma director production 12/03/50 7000
5678 sumith chakrobarty d.g.m. marketing 19/04/43 6000
2365 barun sengupta director personnel 11/05/47 7800
5423 n.k. gupta chairman admin 30/08/56 5400
1006 chanchal singhvi director sales 03/09/38 6700
6213 karuna ganguly g.m accounts 05/06/62 6300
1265 s.n. dasgupta manager sales 12/09/63 5600
4290 jayant Choudhary executive production 07/09/50 6000
2476 anil aggarwal manager sales 01/05/59 5000
6521 lalit chowdury director marketing 26/09/45 8200
3212 shyam saksena d.g.m. accounts 12/12/55 6000
3564 sudhir Agarwal executive personnel 06/07/47 7500
2345 j.b. saxena g.m marketing 12/03/45 8000
0110 v.k. agarwal g.m marketing 31/12/40 9000