첫 번째 줄에 두 개의 숫자(예: 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.05
0.5.5
0.75
0x10
0x10
0
어떤 표현(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"