파일의 각 줄의 고정 위치를 바꾸는 방법

파일의 각 줄의 고정 위치를 바꾸는 방법

아래와 같은 파일이 있습니다. $number(위치 19-30) 및 (위치 59-70)을 센트 단위의 숫자로 바꾸는 방법은 무엇입니까?

업데이트: 모든 필드는 동일한 고정 위치에 있어야 합니다.

입력하다:

asfdassdfasfasfas    1,719.41 23:55:51 016250    9003286     1,719.41    24.64DR 381000
safsdfoskjshfkkdf      184.00 23:57:53 019516    9007963       184.00     2.94DR 384000
agereafdfbfbgsdgd    1,168.00 23:59:55 012229    9002950     1,168.00     3.54DR 0000 

원하는 출력:

asfdassdfasfasfas      171941 23:55:51 016250    9003286       171941    24.64DR 381000
safsdfoskjshfkkdf       18400 23:57:53 019516    9007963        18400     2.94DR 384000
agereafdfbfbgsdgd      116800 23:59:55 012229    9002950       116800     3.54DR 0000  

여기에 이미지 설명을 입력하세요.

답변1

오래됐어awk

입력에 고정 필드 너비를 사용하고 필요에 따라 필드를 자른 다음 원래 너비로 다시 채웁니다 $2.$4

awk 'BEGIN {FIELDWIDTHS = "19 11 29 11 30"} {
     gsub(/\.|,/,"",$4); gsub(/\.|,/,"",$2);
     printf "%s%11s%s%11s%s\n", $1, $2, $3, $4, $5
}' file1

문자 제거는 상황에 따라 달라지지 않고 제거되는 문자 수에 관계없이 필드가 항상 올바른 너비로 채워지므로 이는 일반적인 솔루션이어야 합니다(11).

게진

cat file1
asfdassdfasfasfas    1,719.41 23:55:51 016250    9003286     1,719.41    24.64DR 381000
safsdfoskjshfkkdf      184.00 23:57:53 019516    9007963       184.00     2.94DR 384000
agereafdfbfbgsdgd    1,168.00 23:59:55 012229    9002950     1,168.00     3.54DR 0000 

가주트

asfdassdfasfasfas      171941 23:55:51 016250    9003286       171941    24.64DR 381000
safsdfoskjshfkkdf       18400 23:57:53 019516    9007963        18400     2.94DR 384000
agereafdfbfbgsdgd      116800 23:59:55 012229    9002950       116800     3.54DR 0000

답변2

고쳐 쓰다:새로운 질문에 대해서는 정확한 입력 시나리오에서만 작동하는 다음을 시도해 보십시오.

sed -Ee 's/([0-9]),([0-9]{3})./  \1\2/g;s/ ([0-9]{3})\./  \1/g' <<inputFile>>

출력: .

$ sed -Ee 's/([0-9]),([0-9]{3})./  \1\2/g;s/ ([0-9]{3})\./  \1/g'  temp.txt 
asfdassdfasfasfas      171941 23:55:51 016250    9003286       171941    24.64DR 381000
safsdfoskjshfkkdf       18400 23:57:53 019516    9007963        18400     2.94DR 384000
agereafdfbfbgsdgd      116800 23:59:55 012229    9002950       116800     3.54DR 0000 

    $ head -1 temp.txt 
    asfdassdfasfasfas    1,719.41 23:55:51 016250    9003286     1,719.41    24.64DR 381000
    $ head -1 temp.txt  | wc -c
    88
    $ sed -Ee 's/([0-9]),([0-9]{3})./  \1\2/g;s/ ([0-9]{3})\./  \1/g' | head -1
    asfdassdfasfasfas      171941 23:55:51 016250    9003286       171941    24.64DR 381000
    $ sed -Ee 's/([0-9]),([0-9]{3})./  \1\2/g;s/ ([0-9]{3})\./  \1/g' temp.txt | head -1 | wc -c
    88

(일반적인)각 열 값을 전체 문자열 대신 필드로 처리하여 awk를 사용할 수 있습니다.

awk  '{gsub(",",""); $2=$2*100;$6=$6*100; }1' <<inputFile>>  | rev | column -t | rev

산출:

asfdassdfasfasfas   171941  23:55:51    016250  9003286 171941  24.64DR 381000  
safsdfoskjshfkkdf   18400   23:57:53    019516  9007963 18400   2.94DR  384000  
agereafdfbfbgsdgd   116800  23:59:55    012229  9002950 116800  3.54DR  0000    

관련 정보