2014-07-21 6 views
0

의 내가 같은 것을 포함하는 파일 orders.txt 있다고 가정 해 봅시다 : 열이 \t형식 열

일명 탭 위치로 분리되어

# Description Amount Price Sum 
1 Beermat 1000 0,01€ 10€ 
2 Glass 100 1€ 100€ 
3 Long description 1 10€ 10€ 
4 An even longer description 1 10€ 10€ 
5 An extra long description, for real! 1 10€ 10€ 
6 An extra long description, almost max. length 1 10€ 10€ 
7 Long description for some really fancy product and unfortunately this description is too long to fit into one line - bad luck! 1 10€ 10€ 
8 This line isn’t shown afterwards 1 1€ 1€ 

보통 내가 이러한 것들을 포맷을 같은 결과 약간의 도구 column -ts $'\t' order.txt는 :

# Description         Amount Price Sum 
1 Beermat          1000 0,01€ 10€ 
2 Glass           100  1€  100€ 
3 Long description        1  10€ 10€ 
4 An even longer description      1  10€ 10€ 
5 An extra long description, for real!   1  10€ 10€ 
6 An extra long description, almost max. length 1  10€ 10€ 

이 한 하나 개의 라인이 없기 때문에 잘 작동 터미널 윈도우의 선 너비를 초과하십시오. 따라서 라인 # 7의 경우이 도구는 column: line too long을 출력하고 종료합니다.

내가 찾고 나에게 이와 같은 출력을 생성하는 솔루션입니다 :

# Description         Amount Price Sum 
1 Beermat          1000 0,01€ 10€ 
2 Glass           100  1€  100€ 
3 Long description        1  10€ 10€ 
4 An even longer description      1  10€ 10€ 
5 An extra long description, for real!   1  10€ 10€ 
6 An extra long description, almost max. length 1  10€ 10€ 
7 Long description for some really fancy product 1  10€ 10€ 
    and unfortunately this description is too long 
    to fit into one line - bad luck! 
8 This line isn’t shown afterwards    1  1€  1€ 

답변

2

잘 긴 설명을 처리하고 문자열을 분할하는 동안 고정 폭 후 양, 가격 및 합계를 인쇄 금액, 가격 및 합계 줄이 사소하지 않은 나머지 부분을 인쇄합니다. 문자열을 분할하는 방법에는 여러 가지가 있지만,보다 우아하고 다양한 방법이 있지만 무차별 한 예를 통해 아이디어를 얻을 수 있습니다. 너는 적당하게 이것을 정돈 할 수있다. dwidth 변수를 변경하거나 파일 이름 다음에 두 번째 인수로 원하는 너비를 제공하여 너비를 설정하기 만하면됩니다. #\tDescription\tAmount\tPrice\tSum

#!/bin/bash 

test -r "$1" || { 
    printf "Error: insufficient input, usage ${0//*\//} <orders file>\n\n" 
    exit 1 
} 

oifs=$IFS   # set IFS to only break on tab or newline 
IFS=$'\t\n' 

dwidth=${2:-50}  # set the print width you want for description (default 50) 
i=0 

while read num desc amt price sum || test -n "$num"; do 

    # test description > width, if so print only first 50 (or on word break) 
    if test "${#desc}" -ge "$dwidth" ; then 
     for ((i=$dwidth; i>0; i--)); do 
      test "${desc:$i:1}" = ' ' && break 
     done 

     end=$i 
     printf "%2s %-*s %-8s %-8s %-8s\n" $num $dwidth "${desc:0:end}" $amt $price $sum 

     remain=$((${#desc}-$end))  # calculate remaining chars to print 

     while test "$remain" -gt 0; do # while characters remain 
      strt=$((end+1))    # start printing at last end 
      if test "$remain" -gt "$dwidth"; then # test if more than width remain 
       for ((i=$dwidth; i>0; i--)); do  # if so, break on word 
        test "${desc:$((strt+i)):1}" = ' ' && break 
       done 
       end=$((strt+i))   # set end equal to start + chars in words 
       printf " %-*s\n" $dwidth "${desc:$strt:$i}" # print to width 
      else 
       printf " %-*s\n" $dwidth "${desc:$strt}"  # print rest and break 
       break 
      fi 
      remain=$((${#desc}-$end)) # calculate new remaining chars 
     done 
    else # if description not > width, just print it 
     printf "%2s %-*s %-8s %-8s %-8s\n" $num $dwidth $desc $amt $price $sum 
    fi 

done < "$1" 

exit 0 

출력 : $ bash orders.sh orders.txt

# Description          Amount Price Sum 
1 Beermat           1000  0,01€ 10€ 
2 Glass            100  1€  100€ 
3 Long description         1  10€  10€ 
4 An even longer description       1  10€  10€ 
5 An extra long description, for real!    1  10€  10€ 
6 An extra long description, almost max. length  1  10€  10€ 
7 Long description for some really fancy product and 1  10€  10€ 
    unfortunately this description is too long to fit 
    into one line - bad luck! 
8 This line isn’t shown afterwards     1  1€  1€ 

출력 : $ bash orders.sh orders.txt 60

# Description             Amount Price Sum 
1 Beermat              1000  0,01€ 10€ 
2 Glass              100  1€  100€ 
3 Long description            1  10€  10€ 
4 An even longer description         1  10€  10€ 
5 An extra long description, for real!       1  10€  10€ 
6 An extra long description, almost max. length    1  10€  10€ 
7 Long description for some really fancy product and   1  10€  10€ 
    unfortunately this description is too long to fit into one 
    line - bad luck! 
8 This line isn't shown afterwards        1  1€  1€ 
당신은 예를 들어 tabs로 구분 된 필드, 설명이 당신의 입력 형식을 가정

입니다