awk [컴퓨터 언어] by 바죠

awk는 프로그래밍 언어이다. 특별히 데이터 추출, 간단한 명령어들을 수행할 수 있도록 설계되었다. 입력정보가 파일단위일수도 있지만, 유닉스/리눅스 환경의 명령어 출력 단위일수도 있다. 1970년대 벨랩에서 만들어진 컴퓨터 언어이다. 개발자 3명의 이름을 조합하여 이 언어의 이름을 만들었다. 새이름 auk와 같이 발음한다.
https://en.wikipedia.org/wiki/AWK


문서에서 데이터를 찾아내고 출력하고 간단한 일을 하는데 아주  특화된 프로그래밍 언어이다.  기계적으로 처리되어야 할 내용들이 많이 있지만, 매번 프로그램을 새로 만든다는 것은 비효율적일 수 있다.  지적한 일들을 매우 간단하게 처리할 수 있는 기능이 있어야 한다.  매우 짧은 프로그램일수록 더욱 좋을 것이다. 즉, 문자 탐색, 파일 탐색에 좀 더 특화된 작업을 지향하는 것이다.  또한, 추출한 숫자들을 가지고 간단한 산수를 할 수 있다. 이는 추출한 데이터를 다시 bc -l같은 프로그램에 붙여넣어서 추가로 산수를 하지 않아도 되게 해 주는 효과가 있다.  grep --help 처럼 awk --help 명령어가 먹힌다.

추출과 동시에 산수를 수행할 수 있게 해 준다. 유닉스/리눅스 명령어들과의 연계 작업에서도 그 유용성은 탁월하다. 어떻게 보느냐에 따라서 달라질수 있다. grep, xargs등과 같이기본 유닉스/리눅스 명령어로서 사용될 수도 있다. 물론, 명백한 언어로서의 기능을 가지고 있지만,  매우 간단한 일들을 수행할 수 있을 정도로, 유닉스/리눅스 명령어처럼 간결하고도 효과적으로 사용될 수 있다. 또한, 잘 알고 있는 유닉스/리눅스 명령어와 조합을 통해서 보다 더 일을 쉽게 처리할 수 있다.

장담하는데, awk 같은 것 없어도 연구하는데 지장이 전혀없다. 문제는 업무가 많아지고 있다는 것이다. 더 많은 계산을 해야하고 더 많은 자료를 처리 해야한다. 사람이 하나 하나 처리할 수 있는 상황이 아니다. 반드시 컴퓨터에게 맡겨야만 하는 상황이 오게 된다. 이러할 경우, awk 가 제격이다.

이전에는 한 가지 계산 결과만 가지고 논문이 완성되었다. 그 계산이 진행되는 시간이 길기 때문에 그다리고 그 값을 읽어서 사용했다. 하지만, 보다 많은 데이터가 쏟아져 나온다면 달라진다. 그 계산 결과를 기다리는 시간이 줄어들고 너무나도 많다. 이러한 상황이라면 이 데이터까지 컴퓨터가 처리할 수 있어야만 한다. 하지만, 생산 프로그램이 그런 일까지 해주지는 않는다. 왜냐하면 특정한 일을 반복하게만 되어 있다. 따라서 사용자 중심의 스토리를 만들기 위해서는 특정 패턴의 데이터를 모아야만 한다. 이 때, awk 컴퓨터 언어가 적합하다.


간단하게 처리할 것으로 판단이 되는 경우에는 awk를 사용하는 것이 적절하다. 많은 경우, 간단하게 처리 된다. 웹페이지에서 찾아내면 간단한 스크립트를 찾을 수 있다. 대부분 한 줄짜리 짧은 코드가 될 것이다. 한 번 사용하고 나면 잊어버리기 쉽다. 보관도 필요하다. 인터넷에 연결이 된 상황이라면, 구글로 직접 작업 내용을 영어로 넣어서 탐색할 수 있다. 각종 awk 스크립트들이 쏟아져 나온다. 많은 경우 친절한 설명이 있다.


매우 많은 데이터를 반복적으로 처리해야만 할 경우가 있다. 이러한 경우에는 상황이 다소 달라진다. 간단한 스크립트가 필요하다. 또는 프로그램을 만들어야만 한다. 당연하다. 결국, 대용량 데이터 처리에서, 특별히 간단한 대용량 처리에서 효능을 볼 수 있는 것이 awk 같은 언어이다. 유닉스/리눅스 명령어에서 딱 한 발만 더 나아간 수준이면 해결될 수 있는 문제들이 많이 있다. 매우 간단하면서도 효과적으로 대용량 데이터 처리를 도와준다.

문자열 처리에 매우 뛰어난 python 언어가 효율적일 것이다. 여기서 언급한 awk는 보다 더 간결하다. 유닉스 명령어에서 딱 한 발 더 나아간 것처럼 보인다. 매우 간결하게 유닉스/리눅스 명령어처럼 일들을 처리해 준다. 파이프를 활용하면 연속적으로 많은 명령어들을 조합하여 사용할 수 있다. 이 때, awk를 이용한 짧은 프로그램도 연동되어 사용될 수 있다. 간단하게 특정 데이터를 뽑아내어서 정리할 때에도 편리하다. 확실한 프로덕션 프로그램들로 부터 많은 데이터가 쏟아져 나오는 상황에서는 awk 같은 것이 효율적으로 활용될 수 있다. 일반적인 개발 언어로서는 부족한 부분이 많을 것이다.

awk 언어로 프로젝트 주력 프로그램으로 삼는 것은 무리가 있다. 주력 프로그램은 C/FORTRAN 처럼 계산 처리 속도가 매우 빠른 컴퓨터 언어를 사용하는 것이 유리하다. 이들과 MPI를 연동하는 것은 병렬계산의 핵심사항 중의 핵심사항이다. awk 언어는 이들과  용도가 전혀 다른 언어이다. 사실, 개인 취향, 목적에 맞추어서 제작할 수 있는 확장된 명령어들로 볼 수 있다. 파일속의 특정 패턴---행동으로 이어지는 구조가 특징이다. 특정 패턴에 대한 즉각적인 일처리가 이루어진다.

패턴 비교                           : 숫자, 문자열 탐색하고 비교함, 파일속의 행 단위로 모든 행에 대해서 처리함.
패턴 비교와 연관된 행동       : 패턴 비교를 마치고 나면, 특정 조건에 따라서, 계산과  특정 양식의 출력을 행한다.

pattern-action
여기에서, 패턴은 대략 6가지 종류가 있다. action 부분은 다른 언어와 같이, 계산, 반복, 선택하는 것들로 만들어져 있다. 컴퓨터 언어라고 생각하지 말고, 또다른 유닉스/리눅스 명령어라고 생각하고 먼저 접근하면 친숙해질 수 있다.  실제로 명령어처럼 사용되는 경우가 많다.

http://en.wikipedia.org/wiki/AWK
http://cm.bell-labs.com/cm/cs/awkbook/
http://en.wikibooks.org/wiki/An_Awk_Primer/Awk_Command-Line_Examples
/md.egloos.com/img/eg/icon_file.gif") no-repeat left; list-style: none; padding: 0px 0px 0px 15px;' href="http://pds21.egloos.com/pds/201411/27/11/The_AWK_Programming_Language.pdf" player="0">The_AWK_Programming_Language.pdf
errata (awk 언어의 창시자가 3명이 있다. 이들이 직접 적은 책, 정오표)

기본적인 문법만 익히고, 실제로 필요한 응용 명령어들은 웹페이지 검색을 통해서 얻을 수 있다. 



ls -ltra POSCAR_tmq_* |awk '/Feb 3/{print $NF}' |xargs -i{} cp {} ../e_tot/



-------------------------------------------------------------------------------------------------
 awk 'system("wc "$1)' myfile
 130337  729770 8171254 g1
 130337  729770 8171254 g1
[ihlee@tucana-master C12]$ cat myfile
g1
g1

awk '{print }' myfile
g1
g1
[ihlee@tucana-master C12]$ awk '{print $0}' myfile
g1
g1

awk 'NR==1 {print $0}' myfile
g1

awk '{t+= $1} END{print t}' myfile
6
[ihlee@tucana-master C12]$ cat myfile
1
2
3

awk 'NR>6 {print $1,$2}' DOSCAR >g2

awk 'NR>6 {print $1,$3}' DOSCAR >g3

grep type csa.out|awk ' $4< -204.4 '


awk '/outcar/ {print $2, $3}' csa.out >g1
awk '/outcar/ {print $2/2., $3/2.}' csa.out >g2


head -5  와 동일:

awk 'NR < 6'

-------------------------------------------------------------------------------------------------
cat team_kill.sh
foreach num (`seq -s" " 41 42`)
ssh c${num} ps -ef | grep mm_tinker | awk '{print $2}' | xargs kill -9
end

-------------------------------------------------------------------------------------------------
cat kill.sh

ps -ef | grep remd_tinker | awk '{print $2}' | xargs kill -9
ps -ef | grep sp | awk '{print $2}' | xargs kill -9

여기서는 remd_tinker 라는 프로그램을 동시에 죽이는 방법을 논하고 있다.

즉, 특정 노드에 들어가면, 여러개 프로그램들이 동시에 돌고 있을 수 있다. 특히, 병렬 계산의 경우.

이 때, 이들을 한 방에 죽이는 방법이다.


-------------------------------------------------------------------------------------------------
cat run.sh
foreach num (`seq -s" " 41 42`)
ssh c${num} "kill.sh"
end


-------------------------------------------------------------------------------------------------

pidof csa_vasp.x |awk '{print $1}'| xargs touch


-------------------------------------------------------------------------------------------------
$ ls
one.c  one.h  two.c  two.h

$ find . -name "*.c" | xargs rm -rf

$ ls
one.h  two.h

$ ls
one.c  one.h  two.c  two.h The Geek Stuff.c

$ find . -name "*.c" -print0 | xargs -0 rm -rf

$ ls
one.h  two.h

$ find . -name '*.c' | xargs grep 'stdlib.h'
./tgsthreads.c:#include
./valgrind.c:#include
./direntry.c:#include
./xvirus.c:#include
./temp.c:#include
...
...
...

#find . -name "*.sh" | xargs grep "ksh"

um@server#ls -1 *.sh
linux_sysinfo.sh
aix_sysinfo.sh
audit_script.sh
chperm_messages.sh

um@system#ls -1 *.sh | xargs
linux_sysinfo.sh aix_sysinfo.sh audit_script.sh chperm_messages.sh

-------------------------------------------------------------------------------------------------
 awk '/entropy=/ {print $7}'  OUTCAR
-70.140755

 awk '/energy\(sigma->0\)/' OUTCAR
  energy without entropy =      137.45246924  energy(sigma->0) =      137.45245256
  energy without entropy =      -62.11565870  energy(sigma->0) =      -62.11565755
  energy without entropy =      -70.00741394  energy(sigma->0) =      -70.00741336
  energy without entropy =      -70.13755881  energy(sigma->0) =      -70.13755824
  energy without entropy =      -70.14063029  energy(sigma->0) =      -70.14062971
  energy without entropy =      -70.14075319  energy(sigma->0) =      -70.14075262
  energy without entropy =      -70.14075592  energy(sigma->0) =      -70.14075534
  energy  without entropy=      -70.140756  energy(sigma->0) =      -70.140755

 head -n1 CONTCAR >z1 ;  awk '/entropy=/  {print $7}'  OUTCAR >z2 ; cat z1 z2 >z3 ;awk 'ORS=NR%2?FS:RS' z3 >z4
[ihlee@tucana-master TEST_15]$ vi z4
[ihlee@tucana-master TEST_15]$ cat z4
          15                             -70.140755

awk  ' /entropy=/ {a=$7/12.; b=a+18.195715/2;  print  b} ' out.out3
awk  ' /volume\/ion/ {print $5}  ' out.out3

 tail -n +2 CONTCAR >>z4

원래 목표:
CONTCAR 첫줄을 바꾸는 게 목표이다.
OUTCAR 에서 읽어 들인 특정한 값을 새로운 CONTCAR 파일 첫줄에 넣어주는것이다. 첫번째 숫자 다음에 넣어주는것이다.

 head -n1 CONTCAR >z1 ;  awk '/entropy=/  {print $7}'  OUTCAR >>z1 ; awk 'ORS=NR%2?FS:RS' z1>z2 ; tail -n +2 CONTCAR >>z2

 awk '/entropy=/ {print $7}' OUTCAR  |tail -n 1
-166.640525

head -n1 CONTCAR >z1 ;  awk '/entropy=/  {print $7}'  OUTCAR |tail -n 1 >>z1 ; awk 'ORS=NR%2?FS:RS' z1>z2 ; tail -n +2 CONTCAR >>z2

awk '/enthalpy/ {print $5}' OUTCAR  |tail -n 1

 head -n 1 CONTCAR >z1 ;  awk '/entropy=/  {print $7}'  OUTCAR |tail -n 1 >>z1 ; awk 'ORS=NR%2?FS:RS' z1>z2 ; tail -n +2 CONTCAR >>z2

 head -n 1 CONTCAR >z1 ;  awk '/enthalpy/  {print $5}'  OUTCAR |tail -n 1 >>z1 ; awk 'ORS=NR%2?FS:RS' z1>z2 ; tail -n +2 CONTCAR >>z2

mv z2 CONTCAR

 head -n 1 CONTCAR >z1 ;  awk '/entropy=/  {print $7}'  OUTCAR |tail -n 1 >>z1 ;  awk '{ if ( ( NR % 2 ) == 0 ) { printf("%s\n",$0) } else { printf("%s ",$0) } }'  z1>z2 ; tail -n +2 CONTCAR >>z2

 head -n 1 CONTCAR >z1 ;  awk '/enthalpy/  {print $5}'  OUTCAR |tail -n 1 >>z1 ;  awk '{ if ( ( NR % 2 ) == 0 ) { printf("%s\n",$0) } else { printf("%s ",$0) } }'   z1>z2 ; tail -n +2 CONTCAR >>z2

awk 'ORS=NR%2?FS:RS' 
보다는 아래가 더 안전함.
두 줄이 아닐경우를 대비함.
awk '{ if ( ( NR % 2 ) == 0 ) { printf("%s\n",$0) } else { printf("%s ",$0) } }' 

아래와 같이 CONTCAR 파일을 정리하면 좋은것 같습니다.

 
계산 끝나고 나면, CONTCAR가 나오는데, CONTCAR 첫줄에 에너지 또는 엔탈피를, 첫줄 뒷쪽에다, 적어두는 것이죠.
다시말해서, 새로운 CONTCAR를 만들어서 보관합니다.
 
입력: CONTCAR, OUTCAR
출력: CONTCAR
 
 head -n 1 CONTCAR >z1 ;  awk '/entropy=/  {print $7}'  OUTCAR |tail -n 1 >>z1 ; awk 'ORS=NR%2?FS:RS' z1>z2 ; tail -n +2 CONTCAR >>z2

 head -n 1 CONTCAR >z1 ;  awk '/enthalpy/  {print $5}'  OUTCAR |tail -n 1 >>z1 ; awk 'ORS=NR%2?FS:RS' z1>z2 ; tail -n +2 CONTCAR >>z2

mv z2 CONTCAR
  
PBS 배치 뒤에다 붙여두면 좋을 것 같습니다.

head -n 1 CONTCAR >z1 ;  awk '/entropy=/  {print $7}'  OUTCAR |tail -n 1 >>z1 ; awk 'ORS=NR%2?FS:RS' z1>z2 ; tail -n +2 CONTCAR >>z2
mv z2 CONTCAR
rm z1

--------------------------------------------------------------------------------------------------------------
 awk '/entropy=/ {a=$7/12;   print a}  END {b=-18.195715/2.; print a-b}' out.out3
-9.93689
-0.839036

 awk '/volume\/ion/ {print $5}' out.out3
6.65

 awk '/outcar/ {print $2, $3}' g1
 awk '/outcar/ {print $2/12, $3}' g1
 awk '/outcar/ {print $2/12, $3/12}' g1

awk '/outcar/ {print $0}' g1 | awk '{print $2, $3}'

cat g1
1 U,N,UNIX,000
3 I,M,UNIX,222
3 I,M,LNIX,222
[ihlee@tucana-master Si12_p1]$ awk '{split($2,arr,","); if (arr[3] == "UNIX") print $0}' g1
1 U,N,UNIX,000
3 I,M,UNIX,222
[ihlee@tucana-master Si12_p1]$ awk '{split($2,arr,","); if (arr[3] == "LNIX") print $0}' g1
3 I,M,LNIX,222

 awk '/NELECT/ {print $3}' OUTCAR

 awk '/direct lattice vectors/,/length of vectors/  { NF ==6 ; print $1,$2,$3}' OUTCAR | awk 'NR >1 && NR<5 {print $0}'

--------------------------------------------------------------------------------------------------------------
# print the line immediately after a regex, but not the line
# containing the regex
awk '/regex/{getline;print}'

# print the line immediately before a regex, but not the line
# containing the regex
awk '/regex/{print x};{x=$0}'
awk '/regex/{print (NR==1 ? "match on line 1" : x)};{x=$0}'

http://www.pement.org/awk/awk1line.txt
--------------------------------------------------------------------------------------------------------------
awk 'NR > 6 {print $1, $2}' DOSCAR_20141231_033738_18795>g1
6번째 라인 뒤에 있는 데이터를 뽑아 내어서 다른 파일에 저장한다.

유사한 것들로 아래와 같은것이 있을 수 있다.
awk 'NR > 6 {print $1, $3}' DOSCAR_20141231_033738_18795>g1

awk 'NR > 6 {print $3, $2}' DOSCAR_20141231_033738_18795>g1
--------------------------------------------------------------------------------------------------------------
qstat |awk '/g087lih/' |wc

--------------------------------------------------------------------------------------------------------------
awk '{ $3 = $2 - 10; print $2, $3 }' inventory-shipped

--------------------------------------------------------------------------------------------------------------
 awk 'NR>6 {print ($1-6.1917), $2}' DOSCAR >g1
 awk 'NR>6 {print ($1-6.1917), -$3}' DOSCAR >g2
--------------------------------------------------------------------------------------------------------------
 grep ' 300.000' fort.32|awk '{print $1, $4}'

cat temp |awk '{print $1/3,$2/3,$3/3}'
--------------------------------------------------------------------------------------------------------------
START=$(date +%s
);
sleep 1
;
 
# Your stuff
END=$(date +%s
);
echo $((END-START)) | awk
'{print int($1/60)":"int($1%60)}'

#!/bin/bash
START=$(date +%s)
# do something
# start your script work here

# your logic ends here
END=$(date +%s)
DIFF=$(( $END - $START ))
echo "It took $DIFF seconds"

--------------------------------------------------------------------------------------------------------------
특정 라인만 배제하고 출력 (특정 라인 없애버리기)
awk '!/PSTRESS/' INCAR >g1
echo " PSTRESS = 200." >> g1

특정라인을 없애고, 특정 라인을 추가한다.
 cp INCAR_rlx g1
[ihlee@tucana-master B24]$ awk '!/PSTRESS/' g1 >g2; echo " PSTRESS = 300." >>g2
[ihlee@tucana-master B24]$ diff g1 g2
50d49
<    PSTRESS = 400.
51a51
>  PSTRESS = 300.
특정라인에서 PSTRESS 를 포함하는 라인에서, 400.을 101.로 대치하기.
 awk '/PSTRESS/{gsub(/400./, "101.")};{print}' INCAR

--------------------------------------------------------------------------------------------------------------
여러 개가 출력될 경우, 가장 마지막에 해당하는 것을 가지고 작업을 한다.

v=`awk '/volume of cell/{print $5*6.74834256323085294884}' OUTCAR | tail -n1`
e=`awk '/without entropy=/{print $7/(2.*13.6058)}' OUTCAR | tail -n1`
특정한 포매팅 구조를 가지고 있을 수 있다.  print ---> printf " " 처럼 바뀐다.
v=`awk '/volume of cell/{printf "%20.10f \n", $5*6.74834256323085294884}' OUTCAR | tail -n1`
e=`awk '/without entropy=/{printf "%20.10f \n", $7/(2.*13.6058)}' OUTCAR | tail -n1`

--------------------------------------------------------------------------------------------------------------
좀비 계산들을 죽여야 할 때, 아래와 같이하면 한꺼번에 순서대로 죽일 수 있다.
[ihlee@xb005 ~]$ ps -u ihlee
  PID TTY          TIME CMD
  792 ?        00:00:00 pmi_proxy
  820 ?        06:56:22 vasp.5.2.12_GRA
  821 ?        06:56:14 vasp.5.2.12_GRA
  822 ?        06:56:19 vasp.5.2.12_GRA
  823 ?        06:56:22 vasp.5.2.12_GRA
  824 ?        06:56:22 vasp.5.2.12_GRA
  825 ?        06:56:11 vasp.5.2.12_GRA
  826 ?        06:56:22 vasp.5.2.12_GRA
  827 ?        06:56:22 vasp.5.2.12_GRA
  847 pts/0    00:00:00 bash
  904 pts/0    00:00:00 ps
[ihlee@xb005 ~]$ ps -u ihlee|awk '/vasp/ {print "kill -9 " $1}' | sh -x
+ kill -9 820
+ kill -9 821
+ kill -9 822
+ kill -9 823
+ kill -9 824
+ kill -9 825
+ kill -9 826
+ kill -9 827
[ihlee@xb005 ~]$ ps -u ihlee
  PID TTY          TIME CMD
  847 pts/0    00:00:00 bash
  908 pts/0    00:00:00 ps
Syntax:
sh   option   { shell-script-name }
OR
bash   option   { shell-script-name }
Option can be
-v Print shell input lines as they are read.
-x After expanding each simple-command, bash displays the expanded value of PS4 system variable, followed by the command and its expanded arguments. 

ps -u ihlee |grep vasp |awk '{print "kill -9 ",$1}' |sh -x

--------------------------------------------------------------------------------------------------------------
foreach num (`seq -s" " 41 42`)
ssh c${num} ps -ef | grep mm_tinker | awk '{print $2}' | xargs kill -9
end
--------------------------------------------------------------------------------------------------------------
qstat -a|grep ihlee |grep H
346960.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346961.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346962.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346963.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346964.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346965.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346966.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346967.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346968.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346969.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346970.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346971.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346972.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346973.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346974.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346975.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346976.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346977.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346978.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346979.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346980.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346981.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346982.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346983.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346984.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346985.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346986.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
346987.dna.kias.     ihlee       n20      csa_soldBP24        --      1     20    --  128:0 H   --
 qstat -a|grep ihlee |grep H |awk '{split($0,a,"."); print a[1]}'

346960
346961
346962
346963
346964
346965
346966
346967
346968
346969
346970
346971
346972
346973
346974
346975
346976
346977
346978
346979
346980
346981
346982
346983
346984
346985
346986
346987

홀드 상태의 계산들을 모두 다 대기상태로 바꾸고자 할 때 아래의 명령어를 사용하면 된다.
먼저 job 번호를 찾아야 한다. 그리고 각 번호마다 모두다 qrls로 홀드 상태를 풀어준다.
qstat -a|grep ihlee |grep H |awk '{split($0,a,"."); print "qrls ", a[1]}'|sh -x
+ qrls 346960
+ qrls 346961
+ qrls 346962
+ qrls 346963
+ qrls 346964
+ qrls 346965
+ qrls 346966
+ qrls 346967
+ qrls 346968
+ qrls 346969
+ qrls 346970
+ qrls 346971
+ qrls 346972
+ qrls 346973
+ qrls 346974
+ qrls 346975
+ qrls 346976
+ qrls 346977
+ qrls 346978
+ qrls 346979
+ qrls 346980
+ qrls 346981
+ qrls 346982
+ qrls 346983
+ qrls 346984
+ qrls 346985
+ qrls 346986
+ qrls 346987
대기 중인 자신의 job list를 모두 다 홀드시키는 명령어, 순서대로 하나씩 홀드시키는 명령어
 qstat -a|grep ihlee |grep Q |awk '{split($0,a,"."); print "qhold ", a[1]}' |sh -x
+ qhold 348010
+ qhold 348011
+ qhold 348012
+ qhold 348013
+ qhold 348014
+ qhold 348015
+ qhold 348016
+ qhold 348017
+ qhold 348018
+ qhold 348019
+ qhold 348020
+ qhold 348021
+ qhold 348022
+ qhold 348023
+ qhold 348024
+ qhold 348025
+ qhold 348026
+ qhold 348027
+ qhold 348028
+ qhold 348029
+ qhold 348030
+ qhold 348031
+ qhold 348032
+ qhold 348033
+ qhold 348034
+ qhold 348035
+ qhold 348036
+ qhold 348037
+ qhold 348038
+ qhold 348039
+ qhold 348040
+ qhold 348041
--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
grep " 4 " OUTCAR | head -8 | awk 'BEGIN{i=1}{a[i]=$2 ; i=i+1} END{for (j=1;j<i;j++) print j,a[j]}' > vband.dat
grep " 5 " OUTCAR | head -8 | awk 'BEGIN{i=1}{a[i]=$2 ; i=i+1} END{for (j=1;j<i;j++) print j,a[j]}' > cband.dat
--------------------------------------------------------------------------------------------------------------
 ls -ltr | awk '$10 ~ /^csa_soldSiC18./ {print $10}' | xargs rm

 ls -ltr | awk '$10 ~ /^csa_sold/ {print $10}' | xargs rm
--------------------------------------------------------------------------------------------------------------
kill -9 29861; rm 29861; qstat -a|grep SiC18 |awk '{split($0,a,"."); print "qdel ", a[1]}' |sh -x

SiC18 이라는 글자들을 포함하고 있는 job 들 모두를 취소 하는 명령어.
--------------------------------------------------------------------------------------------------------------
qstat -a |grep BP18|grep Q |awk '{split($0,a,"."); print "qhold ",a[1]}' |sh -x

BP18을 포함하는  job 중에서 Q 상태 job을 모두 H 상태로 변환
--------------------------------------------------------------------------------------------------------------
파일의 첫줄에 특정 숫자를 넣어주기 (1):
echo 12.34 >z1; head -n 1 POSCAR >>z1; awk 'ORS=NR%2?FS:RS' z1>z2; tail -n +2 POSCAR >>z2
mv z2 POSCAR
rm z1

보다 더 간단한 프로그램
파일의 첫 줄에 다른 정보를 첨가 하기 (2):
awk '{if(NR ==1) {print "some", $0} else {print}}' POSCAR

awk '{if(NR ==1) {print "some", $0} else { print }}' POSCAR--------------------------------------------------------------------------------------------------------------

ps -u ihlee|awk '/vasp/ {print "kill -9 " $1}' | sh -x


qstat -a|grep ihlee |grep Q |awk '{split($0,a,"."); print "qhold ", a[1]}' |sh -x
qstat -a|grep ihlee |grep H |awk '{split($0,a,"."); print "qrls ", a[1]}'|sh -x

kill -9 29861; rm 29861; qstat -a|grep SiC18 |awk '{split($0,a,"."); print "qdel ", a[1]}' |sh -x

awk 'BEGIN{min=100000.; mint=" "; t=-100000.} {if( ($3 > t) && ($3 < min) ) {min=$3; mint=$1}}END {print mint, min}' csa.out

awk 'NR>6 {print ($1-6.1917), $2}' DOSCAR >g1
awk 'NR>6 {print ($1-6.1917), -$3}' DOSCAR >g2

awk '{if(NR ==1) {print "some", $0} else { print }}' POSCAR

awk '{if(NF <3) {print}}' g1>g2


head -n 1 CONTCAR > z1
awk '/entropy=/ {print $7}' OUTCAR |tail -n 1 >> z1
awk 'ORS=NR%2?FS:RS' z1 > z2
tail -n +2 CONTCAR >> z2
mv z2 CONTCAR
rm z1

awk 's/^/ /'
 
awk '{$3=""; print $0}' file

awk '{$1=$2=""; print $0}' file
awk  ' /entropy=/ {a=$7/12.; b=a+18.195715/2;  print  b} ' out.out3
awk  ' /volume\/ion/ {print $5}  ' out.out3

$(date +%Y%m%d_%H%M%S)
--------------------------------------------------------------------------------------------------------------
 awk '{ print toupper($0) }' csa_vasp.f90
 awk '{ print tolower($0) }' csa_vasp.f90
--------------------------------------------------------------------------------------------------------------
awk '/A/ && /B/' my_data.txt

awk '/A/ || /B/' my_data.txt

awk '$1 ~ /A/' my_data.txt

awk '$1 ~ /A/ && $2 ~ /B/' my_data.txt

awk '$2 ~ /^abc$/' my_data.txt

--------------------------------------------------------------------------------------------------------------
 awk '{ $1=""; print $0 }' filename
첫 컬럼 제외하고 출력하기, 특히, 줄마다 몇 개의 칼럼이 있는지 알 수 없는 경우

특정 칼럼 제외하고 출력 하기:
awk '{$1=""; print}'
awk '{ $5=""; print }' file
awk '{for(i=2;i<=NF;i++){printf "%s ", $i};printf "\n"}'
최종 칼럼만 출력하기:
awk -F: '{ print $NF }' file.txt

qstat -a |grep ihlee|grep H|awk '{split($0,a,"."); print "qrls ", a[1]}' |sh -x

#!/bin/sh
res1=$(date +%s.%N)
for i in {1..10}
do
qstat -a |grep ihlee|grep H|awk '{split($0,a,"."); print "qrls ", a[1]}' |sh -x
sleep 10.
done
res2=$(date +%s.%N)
dt=$(echo "$res2 - $res1" | bc)
dd=$(echo "$dt/86400" | bc)
dt2=$(echo "$dt-86400*$dd" | bc)
dh=$(echo "$dt2/3600" | bc)
dt3=$(echo "$dt2-3600*$dh" | bc)
dm=$(echo "$dt3/60" | bc)
ds=$(echo "$dt3-60*$dm" | bc)
printf "Total runtime: %d:%02d:%02d:%02.4f\n" $dd $dh $dm $ds
echo "Total runtime: " $dd $dh $dm $ds


#!/bin/sh
res1=$(date +%s.%N)
for i in {1..100}
do
qstat -a |grep ihlee|grep Q|awk /12/ |awk '{split($0,a,"."); print "qhold ", a[1]}' |sh -x
sleep 5.
done

--------------------------------------------------------------------------------------------------------------
 awk --help
Usage: awk [POSIX or GNU style options] -f progfile [--] file ...
Usage: awk [POSIX or GNU style options] [--] 'program' file ...
POSIX options:          GNU long options:
        -f progfile             --file=progfile
        -F fs                   --field-separator=fs
        -v var=val              --assign=var=val
        -m[fr] val
        -O                      --optimize
        -W compat               --compat
        -W copyleft             --copyleft
        -W copyright            --copyright
        -W dump-variables[=file]        --dump-variables[=file]
        -W exec=file            --exec=file
        -W gen-po               --gen-po
        -W help                 --help
        -W lint[=fatal]         --lint[=fatal]
        -W lint-old             --lint-old
        -W non-decimal-data     --non-decimal-data
        -W profile[=file]       --profile[=file]
        -W posix                --posix
        -W re-interval          --re-interval
        -W source=program-text  --source=program-text
        -W traditional          --traditional
        -W usage                --usage
        -W use-lc-numeric       --use-lc-numeric
        -W version              --version
To report bugs, see node `Bugs' in `gawk.info', which is
section `Reporting Problems and Bugs' in the printed version.
gawk is a pattern scanning and processing language.
By default it reads standard input and writes standard output.
Examples:
        gawk '{ sum += $1 }; END { print sum }' file
        gawk -F: '{ print $1 }' /etc/passwd

--------------------------------------------------------------------------------------------------------------
awk '{split($0, a, ":")}'
$0  : string
a    : array
:     : delimiter
         


--------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------
특정 문구를 가지고 있는 라인을 지우고 프린트하기.
특정 라인을 없애버리기.

cat abcd
abcd
defg
hijk
[ihlee@tucana-master 0031]$ awk '!/abcd/{print}' abcd
defg
hijk

즉, awk를 활용할 경우, 출력을 다른 파일로 받아야만한다.
하지만, sed 명령어를 사용하면, 그 파일 이름을 그대로 유지한 채 특정 라인이 사라지게 된 상태로 해당 파일이 저장된다.

sed -i '/abcd/d' abcd

sed -i '/master.hpc/d' test


 cat abcd
abcd
defg
hijk
[ihlee@tucana-master wrk1]$ grep -v 'abcd' abcd
defg
hijk
[ihlee@tucana-master wrk1]$ grep -v abcd abcd
defg
hijk


grep --help

 cat testfile
1
master
master
master
2
3
master
34
master
master
master
[ihlee@tucana-master wrk1]$ sed -i '/master/d' testfile
[ihlee@tucana-master wrk1]$ cat testfile
1
2
3
34


--------------------------------------------------------------------------------------------------------------
awk 'BEGIN {max = 0} {if ($3>max) max=$3} END {print max}' data.dat

awk '{sum=sum+$1} END {print sum}' data.dat

http://www.vectorsite.net/tsawk_3.html#m1
--------------------------------------------------------------------------------------------------------------

빈 줄 없애고 가기
awk  'NF' your_file
빈 줄 없애고, 그리고 연속 한 두 줄을 한줄로 축약해서 출력하기
awk 'NF' yourfile | awk 'ORS=NR%2?FS:RS'

awk 'NF' yourfile |awk 'ORS=NR%2?FS:RS'

head -n1 CONTCAR_201612* |awk 'NF'  |awk 'ORS=NR%2?FS:RS'


 cat abcd
ab cd
ab cd

ab cd
[ihlee@tucana-master wrk1]$
[ihlee@tucana-master wrk1]$ awk /./ abcd
ab cd
ab cd
ab cd
[ihlee@tucana-master wrk1]$ grep . abcd
ab cd
ab cd
ab cd

---------------------------------------------------------------------------------------------------------------
연속하는 두 줄을 합쳐서 한 출로 만들기

awk 'NR%2{printf "%s ",$0;next;}1'  filename

awk 'ORS=NR%2?FS:RS' filename

--------------------------------------------------------------------------------------------------------------

 head -n1 CONTCAR_* |awk 'NF'  |awk 'ORS=NR%2?FS:RS' |awk '{print $5, $2}' | sort -nk2

 head -n1 CONTCAR_* |awk 'NF'  |awk 'ORS=NR%2?FS:RS' |awk '{print $5, $2}' | sort -nrk2

-------------------------------------------------------------
delimiter 를 정의하고 사용하는 방법, awk 언어에서의 사용방법
http://www.theunixschool.com/2012/07/awk-10-examples-to-read-files-with.html
-------------------------------------------------------------
du * |sort -g -r |head -10
디스크 용량 톱 10

ls -l * | awk '{print $6 "\t" $10}' | sort -g -r | head -10
디스크 용량 톱 10 출력 

--------------------------------------------------------------------------------------------------------------
CPU 숫자 합하기:

 pestat |awk '{sum+= $5} END  {print sum}'

계산 중인 CPU 숫자 합하기:

 pestat |awk '{sum+= $3} END  {print sum}'


#!/bin/sh
res1=$(date +%s.%N)
for i in {1..10000}
do
qstat -a |grep ihlee|grep H|awk '{split($0,a,"."); print "qrls ", a[1]}' |sh -x
sleep 600.
done
res2=$(date +%s.%N)
dt=$(echo "$res2 - $res1" | bc)
dd=$(echo "$dt/86400" | bc)
dt2=$(echo "$dt-86400*$dd" | bc)
dh=$(echo "$dt2/3600" | bc)
dt3=$(echo "$dt2-3600*$dh" | bc)
dm=$(echo "$dt3/60" | bc)
ds=$(echo "$dt3-60*$dm" | bc)
printf "Total runtime: %d:%02d:%02d:%02.4f\n" $dd $dh $dm $ds
echo "Total runtime: " $dd $dh $dm $ds


--------------------------------------------------------------------------------------------------------------

echo num_bands =  $(grep NBANDS OUTCAR |awk '{print $15}')



echo num_bands =  $(grep NBANDS OUTCAR |awk '{print $15}') > ztmp
cat ztmp wannier90.win > ztmq
rm wannier90.win
mv ztmq wannier90.win
rm ztmp


--------------------------------------------------------------------------------------------------------------
http://www.thegeekstuff.com/2010/03/awk-arrays-explained-with-5-practical-examples/
http://www.thegeekstuff.com/2010/03/9-powerful-awk-numeric-built-in-functions/

--------------------------------------------------------------------------------------------------------------



---------------------------------------------------------------------------------------------------------------------

dos2unix 처럼 사용할 수도 있다.



---------------------------------------------------------------------------------------------------
$ cat file
hello#how_are_you
i#am_very#well_thank#you

This file has two fields separators, # and _. If we want to print the second field regardless of the separator being one or the other, let's make both be separators!

$ awk -F"#|_" '{print $2}' file
how
am





---------------------------------------------------------------------------------------------------


head -n 1 CONTCAR > z1
awk '/entropy=/  {print $7}'  OUTCAR |tail -n 1 >> z1 
awk 'ORS=NR%2?FS:RS' z1 > z2 
tail -n +2 CONTCAR >> z2
mv z2 CONTCAR
rm z1

head -1 CONTCAR  > ztmp
/usr/local/findSpaceGroup/build/findSpg CONTCAR |grep spg >> ztmp
cat ztmp |awk 'ORS=NR%2?FS:RS' | awk '{print $1, $2, $3, $5}' > zhead
tail -n +2 CONTCAR >> zhead
mv zhead CONTCAR
rm ztmp



#!/bin/sh

npop=50
for i in `seq -s " " -f %04g 1 $npop`
do 
head -1 POSCAR_$i  > ztmp
/usr/local/findSpaceGroup/build/findSpg POSCAR_$i |grep spg >> ztmp
cat ztmp |awk 'ORS=NR%2?FS:RS' | awk '{print $1, $2, $3, $5}' > zhead
tail -n +2 POSCAR_$i >> zhead
mv zhead POSCAR_$i 
rm ztmp
done

------------------------------------------------------------------------------------------------------------------


파일 하나를 여러 디렉토리에 복사하고자 할 때:
 ls -db 00?? | xargs -n 1 cp INCAR_rlx
또는
echo ./0???/ | xargs -n 1 cp CSA_SOLDIER.pbs  

------------------------------------------------------------------------------------------------------------------

echo num_bands =  $(grep NBANDS OUTCAR |awk '{print $15}') > ztmp
cat ztmp wannier90.win > ztmq
rm wannier90.win
mv ztmq wannier90.win
rm ztmp
awk '/E-fermi/ {print "dis_froz_min =", $3-2.}' OUTCAR  |tail -n 1 >ztmp
awk '/E-fermi/ {print "dis_froz_max =", $3+2.}' OUTCAR  |tail -n 1 >>ztmp
sed -i '/num_bands/r ztmp' wannier90.win
rm ztmp
------------------------------------------------------------------------------------------------------------------
awk 'NR==1' POSCAR>z ; awk ' NR >1 ' ../POSCAR_tmq_159_10 >>z ; mv z POSCAR

------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------
------------------------------------------------------------------------------------------------------------------


find . -name   test.txt                                                   현재 디렉토리에서 test.txt 이름의 파일 검색
find /home -name  *.jpg                                              home과 하위 디렉토리에서 jpg 확장자 파일 검색
find /home -user  euser -mtime 7 -iname ".db"              euser가 지난 7일 동안 변경 이력이 있고 .db를 확장자로 가지는 파일 검색
------------------------------------------------------------------------------------------------------------------







핑백

덧글

  • 바죠 2016/01/17 19:06 # 답글

    튜토리얼
    https://www.youtube.com/watch?v=az6vd0tGhJI
    https://www.youtube.com/watch?v=FObjsz-7Wao
  • 바죠 2016/02/09 17:32 # 삭제 답글

    ps -ef | grep PROCESS | grep -v grep | awk '{system "kill -9" $2}

    ps -ef | grep PROCESS | grep -v grep | awk '{print $2}' | xargs kill -9

    tokill=`ps -fea|grep process|awk '{ printf $2" "}'`; kill -9 $tokill;

  • 바죠 2016/02/09 17:35 # 삭제 답글

    kill $(ps aux | grep '[p]ython csp_build.py' | awk '{print $2}')
  • 바죠 2016/02/20 18:48 # 삭제 답글

    kill -9 29861; rm 29861; qstat -a|grep SiC18 |awk '{split($0,a,"."); print "qdel ", a[1]}' |sh -x

    SiC18 이라는 글자들을 포함하고 있는 job 들 모두를 취소 하는 명령어.

  • 바죠 2016/04/21 16:52 # 답글

    awk '{print $0";"}' file

    awk '{print "#"$0}' file

    awk '{print "+++"$0"---"}' file

    echo $(awk 'NR > 1{print line", "}{line=$0;}END{print $0" "}' file)

  • 바죠 2016/04/21 17:08 # 답글

    awk '{print $0"A"}' yourFile

    awk '{if(NF <3) {print}}' g1>g2
  • 바죠 2016/04/21 21:28 # 답글

  • 바죠 2016/06/19 18:48 # 답글

    awk 'NR > 3 {print $1, $2, $3, 0. }' IBZKPT
  • 바죠 2017/01/07 14:34 # 답글

    head -n1 CONTCAR_* |awk 'NF' |awk 'ORS=NR%2?FS:RS' |awk '{print $5, $2}' | sort -nk2

  • 2017/03/22 10:47 # 답글 비공개

    비공개 덧글입니다.
  • 2017/04/03 16:33 # 답글 비공개

    비공개 덧글입니다.
  • 바죠 2017/10/07 19:31 # 답글

    echo ./00?? | xargs -n 1 cp a.out
    multiple copies
  • 바죠 2017/11/11 19:47 # 답글

    #!/bin/sh
    res1=$(date +%s.%N)
    for i in {1..10000}
    do
    qstat -a |grep ihlee|grep H|awk '{split($0,a,"."); print "qrls ", a[1]}' |sh -x
    sleep 600.
    done
    res2=$(date +%s.%N)
    dt=$(echo "$res2 - $res1" | bc)
    dd=$(echo "$dt/86400" | bc)
    dt2=$(echo "$dt-86400*$dd" | bc)
    dh=$(echo "$dt2/3600" | bc)
    dt3=$(echo "$dt2-3600*$dh" | bc)
    dm=$(echo "$dt3/60" | bc)
    ds=$(echo "$dt3-60*$dm" | bc)
    printf "Total runtime: %d:%02d:%02d:%02.4fn" $dd $dh $dm $ds
    echo "Total runtime: " $dd $dh $dm $ds
  • 바죠 2018/05/24 09:45 # 삭제 답글

    awk '/volume of cell/ {print $5}' OUTCAR
    awk '/entropy=/ {print $7}' OUTCAR

  • 바죠 2018/05/24 10:04 # 삭제 답글

    #
    if [ $number -eq 1 ]; then
    awk '/entropy=/ {print $7}' OUTCAR >ml_summary ; awk '/volume of cell/ {print $5}' OUTCAR >>ml_summary
    fi
    #
  • 바죠 2018/06/13 18:49 # 답글

    awk '{printf("%5d : %sn", NR,$0)}' filename > filenamenumbered

    첫 칼럼에 순번을 넣고 싶을 때:

    cat -n file > file_new


  • 바죠 2018/11/09 13:53 # 답글

    cat IBZKPT > ztmp
    cat EIGENVAL |awk 'NF == 4 {print $1, $2, $3, 0.0}' | tail -n +2 >> ztmp
    #and then change the number of k-points.
    mv ztmp KPOINTS
  • 바죠 2018/11/28 23:09 # 답글

    awk '/E-fermi/ {print $3, $3-2., $3+2.}' OUTCAR |tail -n 1
  • 바죠 2019/07/30 17:27 # 답글

    pestat |awk '{print $4}' |awk '{sum+= $1} END {print sum}'


  • 바죠 2019/08/02 09:41 # 답글

    grep sig OUTCAR |awk '/py=/ {print $7}' |tail -n1

  • 바죠 2019/08/02 09:53 # 답글

    grep sig OUTCAR |awk '/py=/ {print $7}' |tail -n1 | awk '{ if ($0 < -70.) {print "Yes"} else {print "No"}}'

  • 바죠 2019/08/02 09:57 # 답글

    var=$(grep sig OUTCAR |awk '/py=/ {print $7}' |tail -n1 | awk '{ if ($0 < -70.) {print "Yes"} else {print "No"}}')
    echo $var
  • 바죠 2019/08/02 10:22 # 답글

    if true; then
    lvar=$(grep sigma OUTCAR |awk '/py=/ {print $7}' |tail -n1 | awk '{ if ($0 < -35.00000) {print "Yes"} else {print "No"}}')
    echo $lvar
    if [ $lvar == "No" ] ; then
    break
    fi
    fi
  • 바죠 2019/10/20 10:48 # 답글

    i=99
    printf -v j "%04d" $i
    echo $j
    i=98
    printf -v j "%04d" $i
    echo $j
  • 바죠 2020/03/11 09:17 # 답글

    find . -type f -name 'CSA_SOLDIER.pbs' |xargs sed -i 's/ -56.427001 / -56.427009 /g'

    find . -name OUTCAR

    find . -name "*.c" -exec wc -l {} \;

    qstat -u ihlee|grep Sn4S4 |grep -E 'R|Q' |wc





    find . -name OUTCAR -exec grep -n "sigma" {} \;








  • 바죠 2021/04/01 19:39 # 답글

    https://news.zum.com/articles/67197011?c=08&sc=54&t=t
댓글 입력 영역

최근 포토로그



MathJax