Bash - 将标题添加到管道表命令

时间:2017-11-16 12:11:09

标签: bash pipe

我有一个简单的脚本将文件students.txt的内容作为基本表输出到打印文件,然后显示。

#!/bin/bash

cat students.txt | column -t -s',' | sort -u -k3 > print.txt
cat print.txt

输出如下所示:

Consoling  ST  DWC  0900
Scribing   RA  DWC  1000
Gloater    AU  DWC  1100
Crimp      DI  DWC  1200

等等。但是,我还希望能够为每个列添加标题并使它们完美对齐,以及不进行排序。我试图使用printf和echo但是当管道输入命令时它们不显示,我无法通过在管道外打印标题名称来正确对齐列。我想要的所需输出看起来像这样:

Family Name  Initials  Interviewer Initials  Interview Time
Consoling    ST        DWC                   0900
Scribing     RA        DWC                   1000
Gloater      AU        DWC                   1100
Crimp        DI        DWC                   1200

我怎么能实现这个目标?

3 个答案:

答案 0 :(得分:1)

有一个oneliner:

cat <(echo "Family Name,Initials,Interviewer Initials,Interview Time") <(sort -u -k3 -t ',' students.txt) | column -s ',' -t > print.txt

这使用了Process Substitution。运行<()内的命令,它的输出显示为文件名。 cat连接两个&#34;文件&#34;,其中包含echo(标题)和sort的输出(用于排序students.txt)。< / p>

    使用选项sort运行
  • -t ','以指定&#34;,&#34;作为分隔符。
  • 使用选项column运行
  • -s ','以指定&#34;,&#34;作为分隔符。

编辑(感谢@tripleee指出来):

可以修改oneliner,以便 Process Substitution cat是不必要的:

{ echo "Family Name,Initials,Interviewer Initials,Interview Time"; sort -u -k3 -t ',' students.txt; } | column -s ',' -t > print.txt

echosort{}分组,并在当前的shell上下文中执行。重定向(管道到column)将应用于整个组。供参考:Grouping Commands

答案 1 :(得分:0)

可能你可以尝试一个简单的回声

cat students.txt | column -t -s',' | sort -u -k3 > print.txt
echo 'Family Name  Initials  Interviewer Initials  Interview Time' && cat print.txt

如果您需要根据标题对齐它们,则可以使用column

column -t <<< "Family_Name  Initials  Interviewer_Initials  Interview_Time
Consoling  ST  DWC  0900
Scribing   RA  DWC  1000
Gloater    AU  DWC  1100
Crimp      DI  DWC  1200
"
Family_Name  Initials  Interviewer_Initials  Interview_Time
Consoling    ST        DWC                   0900
Scribing     RA        DWC                   1000
Gloater      AU        DWC                   1100
Crimp        DI        DWC                   1200

注意:不允许列标题中的空格,否则它将被视为单独的列

答案 2 :(得分:-1)

您将标题Family Name, Initials, Interviewer Initials, Interview Time放在students.txt的内容之前,然后再将其发送到column命令,我认为应该这样做。

也许是这样的:

TEMP=$(mktemp)
TEMP2=$(mktemp)
cat students.txt | sort -u -k3 > $TEMP
echo Family Name, Initials, Interviewer Initials, Interview Time > $TEMP2
cat $TEMP >> $TEMP2
cat $TEMP2 | column -t -s',' > print.txt
rm -f $TEMP $TEMP2
cat print.txt