![쉘 스크립트에서 표 형식으로 출력을 얻는 방법은 무엇입니까?](https://linux55.com/image/177790/%EC%89%98%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%ED%91%9C%20%ED%98%95%EC%8B%9D%EC%9C%BC%EB%A1%9C%20%EC%B6%9C%EB%A0%A5%EC%9D%84%20%EC%96%BB%EB%8A%94%20%EB%B0%A9%EB%B2%95%EC%9D%80%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
내 텍스트 파일에 다음 형식의 데이터가 있습니다
/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