내 스크립트 형식이 작동하려면 grep의 결과에 0을 추가해야 하는데 어떻게 해야 할지 모르겠습니다. 내 grep 결과는 다음과 같습니다.
261 : 261 = 0 | 1192 : 1184 = 8 |
283 : 283 = 0 | 666 : 659 = 7 |
267 : 267 = 0 | 631 : 620 = 11 |
283 : 283 = 0 | 787 : 781 = 6 |
278 : 279 = -1 | 963 : 957 = 6 |
출력이 다음과 같기를 원합니다.
261 : 261 = 000 | 1192 : 1184 = 0008 |
283 : 283 = 000 | 0666 : 0659 = 0007 |
267 : 267 = 000 | 0631 : 0620 = 0011 |
283 : 283 = 000 | 0787 : 0781 = 0006 |
278 : 279 = -001 | 0963 : 0957 = 0006 |
이 결과를 얻으려면 다음 스크립트를 사용하세요.
count100=`grep -ach "0100 $GivenBIN" $line`
count110=`grep -ach "0110 $GivenBIN" $line`
filename=`echo $line | awk -F"/" '{print $NF}'`
echo -e "$filename $count100 : $count110 = $ans1| $count220 : $count230 = $ans4 |"
답변1
귀하의 입력 및 출력 예를 바탕으로 제 생각에는
- 숫자 열은 항상 공백으로 구분됩니다.
- 각 숫자 열의 형식을 알려진 고정 너비로 지정하려고 합니다.
- 주어진 각 열의 각 행이 동일한 자릿수를 갖기를 원합니다.
- 열에는 선행 기호(공백 또는
-
)가 있습니다.
printf
이는 각 숫자 열에 형식을 적용하는 다음 awk 스크립트로 변환됩니다 .
awk 'BEGIN {
widths[1]=widths[3]=3;
widths[5]=" 4";
widths[7]=widths[9]=widths[11]=4
}
{
for (i in widths) $i = sprintf("%0" widths[i] "d", $i);
print
}'
답변2
이것은 4개의 sed 표현식입니다. 길지만 단순
하여 앞에 0을 추가한 다음 왼쪽과 오른쪽 숫자를 각각 3과 4 길이로 자릅니다.
이와 같은 것을 한 줄로 작성하기는 어렵지만 코드의 마지막 섹션에 표시된 것처럼 여러 줄에 걸쳐 배치하면 매우 쉽습니다...
printf가능한해결책이지만 음수 때문에 처음 생각한 것만큼 간단하지 않습니다. 귀하의 요구 사항은 모든 음수가 양수와 동일한 자릿수를 가져야 한다는 것입니다.
그래서 이 sed 방법이 작동하기 때문에 폐기하고 있지만 더 간단한 해결책이 있을 수 있습니다...
sed -r -e "s/^([0-9]+)( : )([0-9]+)( = )(-)?([0-9]+)( )/00\1\200\3\4\500\6\7/" -e "s/0*([0-9][0-9][0-9])( : )0*([0-9][0-9][0-9])( = )(-)?0*([0-9][0-9][0-9])( )/\1\2\3\4\5\6\7/" -e "s/( )([0-9]+)( : )([0-9]+)( = )(-)?([0-9]+)( .)$/\1000\2\3000\4\5\6000\7\8/" -e "s/( )0*([0-9][0-9][0-9][0-9])( : )0*([0-9][0-9][0-9][0-9])( = )(-)?0*([0-9][0-9][0-9][0-9])( .)$/\1\2\3\4\5\6\7\8/" \
<<'EOF'
261 : 261 = 0 | 1192 : 1184 = 8 |
283 : 283 = 0 | 666 : 659 = 7 |
267 : 267 = 0 | 631 : 620 = 11 |
283 : 283 = 0 | 787 : 781 = 6 |
278 : 279 = -1 | 963 : 957 = 6 |
278 : 279 = -1 | 963 : 954 = -1 |
EOF
이것이 출력이다
261 : 261 = 000 | 1192 : 1184 = 0008 |
283 : 283 = 000 | 0666 : 0659 = 0007 |
267 : 267 = 000 | 0631 : 0620 = 0011 |
283 : 283 = 000 | 0787 : 0781 = 0006 |
278 : 279 = -001 | 0963 : 0957 = 0006 |
278 : 279 = -001 | 0963 : 0954 = -0001 |
이는 sed 표현식의 더 읽기 쉬운 버전입니다.
sed -r \
-e "s/^\
([0-9]+)( : )\
([0-9]+)( = )(-)?\
([0-9]+)( )\
/00\1\200\3\4\500\6\7/" \
-e "s/\
0*([0-9][0-9][0-9])( : )\
0*([0-9][0-9][0-9])( = )(-)?\
0*([0-9][0-9][0-9])( )\
/\1\2\3\4\5\6\7/" \
-e "s/( )\
([0-9]+)( : )\
([0-9]+)( = )(-)?\
([0-9]+)( .)$\
/\1000\2\3000\4\5\6000\7\8/" \
-e "s/( )\
0*([0-9][0-9][0-9][0-9])( : )\
0*([0-9][0-9][0-9][0-9])( = )(-)?\
0*([0-9][0-9][0-9][0-9])( .)$\
/\1\2\3\4\5\6\7\8/" \
답변3
당신이 사용할 수있는 인쇄 기능 명령: 첫 번째 인수는 형식 문자열이고 그 뒤에는 각 형식 지정자에 대해 하나씩 형식 문자열에 삽입될 추가 인수가 옵니다.
문자열을 인쇄하기 위한 형식 지정자는 입니다 %s
. 인쇄를 위해 %d
선택적으로 총 자릿수(예: 4)와 0
패딩에 사용되는 선행 문자를 형식으로 지정할 수 있습니다 %04d
. 원하는 +
경우 문자 숫자가 음수인 경우에만 기호를 인쇄하려면 뒤에 공백 문자( )를 추가하십시오. 또한 줄의 마지막 끝을 인쇄 하려면 평소와 같이 형식 문자열을 종료해야 합니다 .%
%
\n
echo
보다인쇄(3)전체 목록에 대한 매뉴얼 페이지입니다.
예를 들면 다음과 같습니다.
count100=grep -ach "0100 $GivenBIN" $line
count110=grep -ach "0110 $GivenBIN" $line
filename=echo $line | awk -F"/" '{print $NF}'
printf '%s %d : %d = % 03d | %s : %d = %04d\n' "$filename" "$count100" "$count110" "$ans1" #...
원하는 형식으로 줄을 인쇄합니다.