55 votes
Accepted

How to compare a program's version in a shell script?

I don't know if it is beautiful, but it is working for every version format I know. #!/bin/bash currentver="$(gcc -dumpversion)" requiredver="5.0.0" if [ "$(printf '%s\n' &...
Luciano Andress Martini's user avatar
36 votes
Accepted

Bash - Integer expression expected

The test command, also named [, has separate operators for string comparisons and integer comparisons: INTEGER1 -eq INTEGER2 INTEGER1 is equal to INTEGER2 vs STRING1 = STRING2 the strings are equal ...
Jeff Schaller's user avatar
  • 66.7k
36 votes

How do I stop Bash from interpreting octal code instead of integer?

You can force conversion of a number to a specific base in bash like so: $ foo=400 $ echo $((8#$foo)) 256 $ bar=0100 $ echo $((10#$bar)) 100 In general the format is $((base#value)).
Ignacio Vazquez-Abrams's user avatar
32 votes
Accepted

How to increment the value of a (decimal) variable (with leading zero) by +1?

The leading 0 causes Bash to interpret the value as an octal value; 012 octal is 10 decimal, so you get 11. To force the use of decimal, add 10# (as long as the number has no leading sign): BN=10#$(...
Stephen Kitt's user avatar
23 votes
Accepted

Bash expansion hexadecimal

You can; you just need to break the range {0..F} into two separate ranges {0..9} and {A..F}: $ printf '%s\n' {{0..9},{A..F}}{{0..9},{A..F}} 00 01 ... FE EF
chepner's user avatar
  • 7,401
19 votes
Accepted

Extracting positive/negative floating-point numbers from a string

grep works well for this: $ echo "2.5 test. test -50.8" | grep -Eo '[+-]?[0-9]+([.][0-9]+)?' 2.5 -50.8 How it works -E Use extended regex. -o Return only the matches, not the context [+-]?[0-9]+([...
John1024's user avatar
  • 74k
19 votes

Grep lines starting with 1, but not 10, 11, 100 etc

Sounds like you just want this: $ grep '^1\b' a 1 TGCAG..... 1 TGCAG...... For the counting portion of this: $ grep -c '^1\b' file 2
slm's user avatar
  • 366k
18 votes

How to increment the value of a (decimal) variable (with leading zero) by +1?

bash treats constants that start with 0 as octal numbers in its arithmetic expressions, so 011 is actually 9. That's actually a POSIX requirement. Some other shells like mksh or zsh ignore it (...
Stéphane Chazelas's user avatar
16 votes
Accepted

How can I numerically sort a single line of delimited items?

With gawk (GNU awk) for the asort() function: gawk -v SEP='*' '{ i=0; split($0, arr, SEP); len=asort(arr); while ( ++i<=len ){ printf("%s%s", i>1?SEP:"", arr[i]) }; ...
αғsнιη's user avatar
  • 41.1k
16 votes
Accepted

Grep lines starting with 1, but not 10, 11, 100 etc

With awk: awk '$1 == "1" { print; x++ } END { print x, "total matches" }' inputfile
DopeGhoti's user avatar
  • 74.7k
16 votes
Accepted

How to sort lines by float number

If using GNU sort or compatible, you can use its -g switch to do a general numeric sort: $ sort -g -k5,5 file name: yyy --- time: 3.2 seconds name: xxx --- time: 5.4 seconds name: zzz --- time: 6.4 ...
slm's user avatar
  • 366k
16 votes

How to round to 2 decimals in bash like MS Excel does?

printf '%.2f\n' 8.125 Will convert that 8.125 textual representation of a decimal number to an internal binary representation using something like the standard strtod() or strtold() C functions, ...
Stéphane Chazelas's user avatar
15 votes

Bash expansion hexadecimal

Using printf: $ printf '%.2x\n' {0..255} The format string %.2x says to format the output as a zero-filled, two-digit, lower-case, hexadecimal number (%02x would have done the same). If you want ...
Kusalananda's user avatar
  • 327k
15 votes
Accepted

bash + how to calculate percentage from number

bash cannot do floating point math, but you can fake it for things like this if you don't need a lot of precision: $ number=248 $ echo $(( number*80/100 )) 198
DopeGhoti's user avatar
  • 74.7k
15 votes

How to sort each 20 lines in a 1000 line file and save only the sorted line with highest value in each interval to another file?

Via awk: NR%20==1 {max=$4 ; line=$0} { if ($4>max) {max=$4;line=$0} } NR%20==0 {print line}
FelixJN's user avatar
  • 13.3k
14 votes

How to compare a program's version in a shell script?

Shorter version, assuming GNU sort: version_greater_equal() { printf '%s\n%s\n' "$2" "$1" | sort --check=quiet --version-sort } version_greater_equal "${gcc_version}"...
MarcH's user avatar
  • 261
14 votes

Grep lines starting with 1, but not 10, 11, 100 etc

Either of these will pick out lines with a 1 in the first column awk '$1 == 1' grep -w '^1' These can both can be extended so you don't even need the wc to count the lines awk '$1==1 { x++ } END { ...
Chris Davies's user avatar
14 votes

How do I add numbers from two txt files with Bash?

Along the paste lines, but doing the math with bc: $ paste -d+ file1 file2 | bc 7 9 11 13 15 The intermediate result (before bc): $ paste -d+ file1 file2 1+6 2+7 3+8 4+9 5+10 For a more bash-...
Jeff Schaller's user avatar
  • 66.7k
14 votes
Accepted

Trim trailing zeroes off a number extracted by jq

Pass the price through tonumber: curl -sS 'https://api.binance.com/api/v1/ticker/price?symbol=BTCUSDT' | jq -r '.price | tonumber' This would convert the price from a string to a number, removing ...
Kusalananda's user avatar
  • 327k
13 votes

How can I numerically sort a single line of delimited items?

Using perl there's an obvious version; split the data, sort it, join it back up again. The delimiter needs to be listed twice (once in the split and once in the join) eg for a , perl -lpi -e '$_=...
Stephen Harris's user avatar
13 votes
Accepted

Convert a list of decimal values in a text file into hex format

You can do this using printf and bash: printf '%08x\n' $(< test.txt) Or using printf and bc...just...because? printf '%08s\n' $(bc <<<"obase=16; $(< test.txt)") In order to print ...
jesse_b's user avatar
  • 36.4k
13 votes
Accepted

How to grep and cut numbers from a file and sum them

You can take help from paste to serialize the numbers in a format suitable for bc to do the addition: % grep "30201" logfile.txt | cut -f6 -d "|" 650 1389 945 % grep "30201" logfile.txt | cut -f6 -d ...
heemayl's user avatar
  • 55.4k
12 votes

Reverse a hexadecimal number in bash

With fold + tac + tr : $ echo 030201|fold -w2|tac|tr -d "\n" 010203 fold - split every 2 byte tac - reverse cat tr - remove newlines
Ipor Sircer's user avatar
  • 14.4k
12 votes
Accepted

How to generate a comma separated list of random ints

You can use paste -s to join lines: shuf -i1-10 | paste -sd, - This uses -i option of shuf to specify a range of positive integers. The output of seq can be piped to shuf: seq 10 | shuf | paste -sd, -...
rowboat's user avatar
  • 2,792
12 votes
Accepted

How to round to 2 decimals in bash like MS Excel does?

If your system uses GNU coreutils then the numfmt command should be available, and allows you to choose between rounding ‘up’, ‘down’, ‘from-zero’ (the default), ‘towards-zero’, or ‘nearest’. For ...
steeldriver's user avatar
  • 79.6k
11 votes
Accepted

Simple bash script to print prime numbers from 1 to 1000

factor {2..1000} | awk 'NF==2{print $2}'
orion's user avatar
  • 12.4k
11 votes
Accepted

How to rank numbers in array by Unix?

If that list was in a file, one per line, I'd do something like: sort -nu file | awk 'NR == FNR {rank[$0] = NR; next} {print rank[$0]}' - file If it was in a zsh $array: sorted=(${(nou)...
Stéphane Chazelas's user avatar

Only top scored, non community-wiki answers of a minimum length are eligible