如何从 Shell 脚本获取表格格式的输出?

如何从 Shell 脚本获取表格格式的输出?

我的文本文件中有以下格式的数据

/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/WGS1/CLM/text1.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/WGS1/CLM/text2.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/EMP2/text3.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/ACS1/text4.txt

我想要如下输出

                 Path Name                                         File Name
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/WGS1/CLM/           text1.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/WGS1/CLM/           text2.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/EMP2/               text3.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/ACS1/               text4.txt

答案1

您可以使用以下awk命令column

awk -F'/' 'BEGIN{print "PathName FileName"}{a="";for(i=2;i<=NF-1;i++){a=a"/"$i};a=a"/";print a"\t"$NF}' file_name  | column -t

它将打印如下:

PathName                                                  FileName
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/WGS1/CLM/  text1.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/WGS1/CLM/  text2.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/EMP2/      text3.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/ACS1/      text4.txt

如果你想保留单词之间的空格Path Name and File Name,那么你可以用制表符而不是空格来分隔。

awk -F'/' 'BEGIN{print "         Path Name\tFile Name"}{a="";for(i=2;i<=NF-1;i++){a=a"/"$i};a=a"/";print a"\t"$NF}' file_name  | column -t -s $'\t'
         Path Name                                        File Name
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/WGS1/CLM/  text1.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/WGS1/CLM/  text2.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/EMP2/      text3.txt
/gpfs/pcenterdata/test/SrcFiles/WCC_CDHP_LITES/ACS1/      text4.txt

答案2

仅限 ksh(例如 printf 是内置的 shell)

# find the longest path name
MP=0
while read
do
  P="${REPLY%/*}"
  PS=${#P}
  [ $PS -le $MP ] || MP=$PS
done < /tmp/test.txt

# calculate where to put "Path Name"
(( MP++ ))
T="Path Name"
TS=${#T}
(( SS = ( MP - TS ) / 2 ))
(( SP = ( MP - TS ) % 2 ))
printf "%${SS}s%s%${SS}s%${SP}s %s\n" "" "$T" "" "" "File Name"

# format the input text
while read
do
  P="${REPLY%/*}"
  F="${REPLY##*/}"
  printf "%-${MP}s %s\n" "$P/" "$F"
done < /tmp/test.txt

您可能会理解为什么一些心脏较弱的人会重新使用 POSIX 命令。

答案3

使用 Perl + column,你可以按照以下方式运行一些东西

perl -pE 'BEGIN{say "Path\tFile\n"} s!.*/\K!\t!' input | column -t

答案4

与 Prvt_Yadav 一样,您可以使用 awk & column,但 awk 的“gensub”函数可用于提取所需的文本。

awk 'BEGIN{print "PathName\tFileName"} {f=gensub(/.*\//,"\\1","1"); p=gensub(/[^/]*$/,"\\1","1"); print p"\t"f}' | column -t

相关内容