我有一个简单的脚本将文件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
我怎么能实现这个目标?
答案 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
echo
和sort
按{}
分组,并在当前的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