printf "format" contents
%a -- Interprets the associated argument as double, and lowercase letters in C99 the format of hexadecimal floating-point literal
printf "%a\n" 16
Put numbers between % and a to control the format,
printf "%10a\n" 16
%A -- same as above but with uppecase letters.
%b -- Print the associated argument while interpreting backslash escapes in there. ASCII code table
printf "\x27\n" # HEX code for single quote
printf "%b\n" \\x27 # HEX code, hexadecimal
printf "%b\n" '\x27'
printf "\047\n" # OCT code for single quote
printf "%b\n" \\047 # OCT code, octal
printf "%b\n" '\047'
printf "%b\n" \\x40
printf "%b\n" \\100
printf "%b\t" \\x27 \\047 \\x40 \\100
printf "%b " \\x27 \\047 \\x40 \\100
%c -- Interprets the associated argument as char: only the first character of a given argument is printed.
printf "%c\n" string
Only s will be printed.
%d -- Print the associated argument as signed decimal number (integer).
printf "%d\n" 1234567890
printf "%3d:" 123 45 6 7890
printf "%3d: %03d; %04d, %d\n" 123 45 6 7890
printf "%3d:%03d;%04d,%d\n" 123 45 6 7890
Add "," for every three digits:
printf "%'d\n" 1234567890
but the format is depending on the environment variable $LC_NUMERIC :
LC_NUMERIC=lzh_TW printf "%'d\n" 1234567890
Compare with the : label operation in sed. (In this case, t label is used; see also Branching and Flow Control in sed)
echo "1234567890" | sed -e ':a' -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/' -e 'ta'
echo "1234567890" | sed -e ':a' -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'
echo "1234567890" | sed -e ':a' -e 's/\(.*[0-9]\)\([0-9]\{3\}\)/\1,\2/;ta'
or shorter sed -re ':a;s/(.*[0-9])([0-9]{3})/\1,\2/;ta'
Explaination: Suppose the input string is 12342342342343434
1. Group the digits into two groups using \( and \).
2. The first group is all the digits up to last three digits.
The last three digits gets captured in the 2nd group.
3. Then the two matching groups get separated by a comma.
Then the same rules get applied to the line again and again,
until all the numbers have been grouped in groups of three digits.
4. For example, in the first iteration it will be 12342342342343,434
5. In the next iteration 12342342342,343,434 and goes on till
there are less than three digits. ref
6. sed with -r switch activates the ERE. For portability you can also use -E just like that in grep.
and its reverse sed -re ':a;s/([0-9]{3})([0-9].*)/\1,\2/;ta'
%i -- same as %d
%e -- Interpret the associated argument as double, and print it in <N>±e<N> format.
printf "%e\n" 10.00 #科學記號
printf "%+e\n" 10.00 #force print ± signs
%E -- Same as above with capital E.
%f -- Interpret and print the associated argument as floating point number.
printf "%f\n" 10
printf "%10.2f\n" 10
printf "%+10.2f\n" 10
a=1234567890.986 ; printf "%+10.2f\n" $a
a=1234567890.986 ; printf "%+10.2e\n" $a
%g -- Interprets the associated argument as double, but prints it like %f or %e.
printf "%03g" 1 2 12 123
在 % 和 g 之間沒 「0」 的數字視為控制顯示格式。
%o -- Print the associated argument as unsigned octal number (integer).
printf "%o\n" 32
%x -- Print the associated argument as unsigned hexadecimal number in lowercase.
printf "%x\n" 32
printf "%x\n" 31
%X -- same as above but print hex number in uppercase.
printf "%X\n" 31
%% -- %
Print Unicodes:
printf "\u967d\u660e\u4ea4\u5927\n" # 陽明交大
Unicode lookup: https://www.ifreesite.com/unicode-ascii-ansi.htm
loop in bash:
Write shell scripts to generate a 9x9 multiplication tables, using
while....do....done
until....do....done
for......do....done
The output should look like,
$ ./multab.sh 9 9
1 2 3 4 5 6 7 8 9
2 4 6 8 10 12 14 16 18
3 6 9 12 15 18 21 24 27
4 8 12 16 20 24 28 32 36
5 10 15 20 25 30 35 40 45
6 12 18 24 30 36 42 48 54
7 14 21 28 35 42 49 56 63
8 16 24 32 40 48 56 64 72
9 18 27 36 45 54 63 72 81
Advanced version: Generate 9x9 multiplication table in a formatted output as
1x1=01 1x2=02 1x3=03 1x4=04 1x5=05 1x6=06 1x7=07 1x8=08 1x9=09
2x1=02 2x2=04 2x3=06 2x4=08 2x5=10 2x6=12 2x7=14 2x8=16 2x9=18
3x1=03 3x2=06 3x3=09 3x4=12 3x5=15 3x6=18 3x7=21 3x8=24 3x9=27
4x1=04 4x2=08 4x3=12 4x4=16 4x5=20 4x6=24 4x7=28 4x8=32 4x9=36
5x1=05 5x2=10 5x3=15 5x4=20 5x5=25 5x6=30 5x7=35 5x8=40 5x9=45
6x1=06 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36 6x7=42 6x8=48 6x9=54
7x1=07 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49 7x8=56 7x9=63
8x1=08 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64 8x9=72
9x1=09 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81
Ultimate version: Generate 9x9 multiplication table in a formatted output as
1x1=1 1x2=2 1x3=3 1x4=4 1x5=5 1x6=6 1x7=7 1x8=8 1x9=9
2x1=2 2x2=4 2x3=6 2x4=8 2x5=10 2x6=12 2x7=14 2x8=16 2x9=18
3x1=3 3x2=6 3x3=9 3x4=12 3x5=15 3x6=18 3x7=21 3x8=24 3x9=27
4x1=4 4x2=8 4x3=12 4x4=16 4x5=20 4x6=24 4x7=28 4x8=32 4x9=36
5x1=5 5x2=10 5x3=15 5x4=20 5x5=25 5x6=30 5x7=35 5x8=40 5x9=45
6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36 6x7=42 6x8=48 6x9=54
7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49 7x8=56 7x9=63
8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64 8x9=72
9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81
More about devices
- /dev/sd*
- /dev/fd?
- /dev/md?
- /dev/cdrom
- /dev/sr?
- /dev/eth?
- /dev/console
- /dev/null
wget http://wild.life.nctu.edu.tw/class/common/pietty0327.exe > /dev/null 2>&1
Data pipes:
0 STDIN
1 STDOUT
2 STDERR
Adding an & before the number will assign them as the destination.
wget -q http://wild.life.nctu.edu.tw/class/common/pietty0327.exe
- /dev/zero
dd if=/dev/zero of=/dev/sdg bs=4096k #Fill drive sdg with 0x00 hex. This will ERASE all of the data in /dev/sdg and CANNOT be recovered !!!
dd if=/dev/zero of=/tmp/file.m bs=1024 count=1024 #Create a file /tmp/file.m with 1MB size and empty contents of 0x00 hex.
dd if=/dev/zero of=/tmp/file.g bs=1024k count=1024 #Create a file /tmp/file.g with 1GB size and empty contents of 0x00 hex.
mkswap /tmp/file.g
swapon /tmp/file.g
dd if=/dev/sda of=/dev/sdb bs=4096 #Diskcopy between drives regardless of the physical size.
- /dev/full
echo "Hello world" > /dev/full
-sh: echo: write error: No space left on device
echo "Hello world" > /dev/null
直接return shell prompt
- /dev/random
- /dev/urandom
echo $RANDOM
Generate a random number between 0~65535.
date +%s
Current time in seconds since 1970-01-01 00:00:00.
date +%N
Current time in 109 seconds.
date +%s%N
Current time in the precision of 109 seconds since 1970-01-01 00:00:00.
head -2 /dev/urandom 會印出一堆亂碼,之後終端機會掛掉,此時打resize ; reset回復正常
head -100 /dev/urandom | cksum
See also files under /proc/sys/kernel/random.
Internet references:
Delete blank lines in the file.
sed -e '/^[ \t] *$/d' -e '/^$/d' file
Exercise 1: Write a shell script to convert 1-letter code to 3-letter code for amino acids. Example website. You may find tables in the Wiki or use the file. Also calcuate its molecular weight in the units of kDa and g/mol.
Exercise 2: Write a shell script to convert convert 3-letter code to 1-letter code for amino acids.
Cut the first 3 characters in various ways:
cut -c 1-3
sed 's/\(...\).*/\1/'
awk '{print substr($0,1,3)}'
or in bash:
#!/bin/sh
cat sample1.txt | while read FILE
do
SUBSTRING=${FILE:0:3}
echo $SUBSTRING
done
Exercise 3: Calculate the GC contents for a input sequence of DNA.