私のテキストファイルには次の形式のデータがあります
/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はシェル組み込み)
# 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+ カラムを使用すると、次のように実行できます。
perl -pE 'BEGIN{say "Path\tFile\n"} s!.*/\K!\t!' input | column -t
答え4
Prvt_Yadavと同様に、awkと列を使用できますが、awkの「gensub」機能を使用して必要なテキストを抽出できます。
awk 'BEGIN{print "PathName\tFileName"} {f=gensub(/.*\//,"\\1","1"); p=gensub(/[^/]*$/,"\\1","1"); print p"\t"f}' | column -t