파일의 첫 번째 번호를 절반으로 바꾸기 [닫기]

파일의 첫 번째 번호를 절반으로 바꾸기 [닫기]

첫 번째 줄에 두 개의 숫자(예: 170 1742)가 있고 그 다음에는 다른 여러 줄이 있는 일련의 파일이 있습니다. 각 파일의 첫 번째 숫자 절반(예: 85 1742)을 바꾸려면 Unix에서 어떻게 해야 합니까?

답변1

perl -pi -e 's|\d+|$&/2|e if $. == 1; close ARGV if eof' ./*.txt

현재 디렉터리에 있는 숨겨지지 않은 각 파일의 첫 번째 줄에 있는 첫 번째 일련의 10진수를 해당 숫자의 절반을 나타내는 표준 10진수 표현으로 바꿉니다 txt(예: 006은 3, 007은 3.5).

숫자가 큰 경우(예: 1e20보다 큰 경우) perl공학 표기법(5e+19)을 대신 사용할 수 있습니다.

분명히 이 방법은 십진 정수에서만 작동합니다. 1.5에 적용 하면 .1대신 ; .5가 적용되면 8이나 0x8 대신 (단지 절반만) 제공됩니다 .0.050.5.50.750x100x100

어떤 표현(1, 010(8진수 8이 아닌 10을 나타냄), -1.123, 2.23e-4, inf, 무한대, NaN...))에서 십진수를 처리하려면 일치하는 정규식을 조정해야 합니다. 예:

s{(\d*\.\d+|\d+\.?)(e[-+]?\d+)?|nan|inf(inity)?}{$&/2}ie

또는 숫자가 공백이 아닌 문자의 첫 번째 시퀀스인지 여부와 같이 줄에서 숫자의 위치에 대해 몇 가지 가정을 합니다.

s{\S+}{$&/2}e

답변2

이 같은?

awk 'FNR==1{print $1/2,$2;next}1' ./*.txt #or /directory/* or just file.txt

심지어

awk 'FNR==1{$1=$1/2}1' file1

위의 awk는 해당 결과를 화면에 인쇄하거나 다음을 사용하여 수정된 출력을 새 파일로 리디렉션할 수 있습니다.>newfile

GNU awk를 사용하면 다음을 사용하여 원본 파일에 직접 변경 사항을 적용할 수 있습니다.Gnu awk 내부 옵션:

awk -i inplace 'FNR==1{$1=$1/2}1' file1

awk가 inplace를 지원하지 않으면 다음과 같이 수동으로 수행할 수 있습니다.

 awk 'FNR==1{$1=$1/2}1' file > newfile && mv newfile file

이것은 본질적으로 awk(및 sed) 내부 편집이 뒤에서 수행하는 작업입니다.

답변3

tempd=$(mktemp -d)
for f in ./*.csv
do
   < "$f" \
       sed -e '1y/\t-/ _/; 1!s/.*/[&]/' |
       dc -e '
       [q]sq
       [?z0=q pc z0=?]s? # macro "?" to print line
       ?r2/ n32anpc l?x  # 1st line div/2 the last stack elem print it+spc+2nd
      ' \
   > "$tempd/$f"
   mv "$tempd/$f" .
done
rm -r "$tempd"

관련 정보