teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

9

追加

2016/10/04 03:37

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -37,4 +37,40 @@
37
37
  LANG=C awk -F'\t' '{for(i=1;i<NF+1;i++){if(i!=1){if(i==3){printf"%2d",$i}\
38
38
  else if(i==4){printf"%10s",$i}else{printf" %s",$i}}else{ff="";n=split($i,ar,"/");\
39
39
  while(n>0){ff=ff ar[n] "/";n--};sub("/$","",ff);printf "%-80s",ff}}print""}' | nkf -Swx
40
- ```
40
+ ```
41
+
42
+ awkの簡単な説明ですが
43
+ ```awk
44
+
45
+ awkはsedと同じように入力ファイル1行づつ処理を行います。
46
+  awk '{....}' <infile >outfile
47
+
48
+ 1行のセパレータはデフォルト空白またはタブですそれ以外は-Fにて指定することができます。
49
+ 今回はタブだけにしたいので-Fで指定しています。
50
+
51
+ 詳しくは'awk wiki'でググッた方が良いです。分かり易いです。
52
+ 今回使ったawkを解説します(分解して)
53
+
54
+ awk -F'\t' #タブのセパレータ指定
55
+
56
+ '{for(i=1;i<NF+1;i++){ #NFはタブ区切りのフィールド数 i:フィールドの位置として利用
57
+
58
+ if(i!=1){ #フィールドの一番目でない行判定
59
+
60
+ if(i==3){ printf"%2d",$i}\  #3番目のフィールドを2桁で表示
61
+
62
+ else if(i==4){printf"%10s",$i} #4番目のフィールドを10桁で表示
63
+
64
+ else{printf" %s",$i}} #1,3,4以外を表示
65
+
66
+ else{ff="";n=split($i,ar,"/");\ #1フィールド目を"/"で分解して配列arに挿入
67
+
68
+ while(n>0){ff=ff ar[n] "/";n--} #配列の最後から逆読みで/を加えてffに文字列追加
69
+
70
+ ;sub("/$","",ff);  #ff行の最後の余分な/を削除
71
+
72
+ printf "%-80s",ff} #ffを80桁の右詰で表示
73
+
74
+ }print""}' #ラインの改行を表示
75
+ ```
76
+

8

変更

2016/10/04 03:37

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -33,8 +33,8 @@
33
33
  実行環境のLANGをUTF8としています。表示用です。
34
34
  ```bash
35
35
  #!/bin/sh
36
- find /home/ts21adm/test -printf "%p\t%M\t%n\t%s\t%TY-%Tm-%Td\t%TH:%TM\n" | nkf -Ws |\
36
+ find /home/ts21adm/test -printf "%p\t%M\t%n\t%s\t%TY-%Tm-%Td\t%TH:%TM\n" | nkf -Wsx |\
37
37
  LANG=C awk -F'\t' '{for(i=1;i<NF+1;i++){if(i!=1){if(i==3){printf"%2d",$i}\
38
38
  else if(i==4){printf"%10s",$i}else{printf" %s",$i}}else{ff="";n=split($i,ar,"/");\
39
- while(n>0){ff=ff ar[n] "/";n--};sub("/$","",ff);printf "%-80s",ff}}print""}' | nkf -Sw
39
+ while(n>0){ff=ff ar[n] "/";n--};sub("/$","",ff);printf "%-80s",ff}}print""}' | nkf -Swx
40
40
  ```

7

追加

2016/10/04 01:25

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -28,4 +28,13 @@
28
28
  awk -F'\t' '{for(i=1;i<NF+1;i++){if(i!=1){if(i==3){printf"%2d",$i}\
29
29
  else if(i==4){printf"%10s",$i}else{printf" %s",$i}}else{ff="";n=split($i,ar,"/");\
30
30
  while(n>0){ff=ff ar[n] "/";n--};sub("/$","",ff);printf "%-120s",ff}}print""}'
31
+ ```
32
+
33
+ 実行環境のLANGをUTF8としています。表示用です。
34
+ ```bash
35
+ #!/bin/sh
36
+ find /home/ts21adm/test -printf "%p\t%M\t%n\t%s\t%TY-%Tm-%Td\t%TH:%TM\n" | nkf -Ws |\
37
+ LANG=C awk -F'\t' '{for(i=1;i<NF+1;i++){if(i!=1){if(i==3){printf"%2d",$i}\
38
+ else if(i==4){printf"%10s",$i}else{printf" %s",$i}}else{ff="";n=split($i,ar,"/");\
39
+ while(n>0){ff=ff ar[n] "/";n--};sub("/$","",ff);printf "%-80s",ff}}print""}' | nkf -Sw
31
40
  ```

6

変更

2016/10/04 01:15

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -21,11 +21,11 @@
21
21
  done
22
22
  ```
23
23
 
24
- とえあえずファイルスの最大長を80としました。最終行の-80の部分で調整できます。
24
+ タブをセレータとして最大長を120としました。
25
25
  ```bash
26
26
  #!/bin/sh
27
- find /usr/local -printf "%p %M %n %s %TY-%Tm-%Td %TH:%TM\n" | \
27
+ find /usr/local -printf "%p\t%M\t%n\t%s\t%TY-%Tm-%Td\t%TH:%TM\n" | \
28
- awk '{for(i=1;i<NF+1;i++){if(i!=1){if(i==3){printf"%2d",$i}\
28
+ awk -F'\t' '{for(i=1;i<NF+1;i++){if(i!=1){if(i==3){printf"%2d",$i}\
29
29
  else if(i==4){printf"%10s",$i}else{printf" %s",$i}}else{ff="";n=split($i,ar,"/");\
30
- while(n>0){ff=ff ar[n] "/";n--};sub("\/$","",ff);printf "%-80s",ff}}print""}'
30
+ while(n>0){ff=ff ar[n] "/";n--};sub("/$","",ff);printf "%-120s",ff}}print""}'
31
31
  ```

5

更新

2016/10/03 14:17

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -19,4 +19,13 @@
19
19
  echo "$ff" | rev | cut -d\ -f2- | rev | tr '\n' ' '
20
20
  echo $ff | rev | cut -d\ -f1 | rev | awk '{n=split($1,ar,"/");while(n>0){printf ar[n] "/";n--}printf "\n"}' |sed 's/\/$//'
21
21
  done
22
+ ```
23
+
24
+ とえあえずファイルパスの最大長を80としました。最終行の-80の部分で調整できます。
25
+ ```bash
26
+ #!/bin/sh
27
+ find /usr/local -printf "%p %M %n %s %TY-%Tm-%Td %TH:%TM\n" | \
28
+ awk '{for(i=1;i<NF+1;i++){if(i!=1){if(i==3){printf"%2d",$i}\
29
+ else if(i==4){printf"%10s",$i}else{printf" %s",$i}}else{ff="";n=split($i,ar,"/");\
30
+ while(n>0){ff=ff ar[n] "/";n--};sub("\/$","",ff);printf "%-80s",ff}}print""}'
22
31
  ```

4

修正

2016/10/03 07:06

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -8,7 +8,7 @@
8
8
  awk '{for(i=1;i<NF+1;i++){if(i!=NF){if(i==2){printf"%2s",$i}\
9
9
  else if(i==3){printf"%10s",$i}else{printf" %s",$i}}else{n=split($i,ar,"/");\
10
10
  printf" ";while(n>0){printf ar[n] "/";n--}printf "\n"}}}' | \
11
- sed -e 's/^ //' -e s/\/$//'
11
+ sed -e 's/^ //' -e 's/\/$//'
12
12
  ```
13
13
 
14
14
  revを使ってみました

3

追加

2016/10/03 06:29

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -10,3 +10,13 @@
10
10
  printf" ";while(n>0){printf ar[n] "/";n--}printf "\n"}}}' | \
11
11
  sed -e 's/^ //' -e s/\/$//'
12
12
  ```
13
+
14
+ revを使ってみました
15
+ ```bash
16
+ #!/bin/sh
17
+ find /usr/local/src -printf "%M %2n %10s %TY-%Tm-%Td %TH:%TM %p\n" | while read ff
18
+ do
19
+ echo "$ff" | rev | cut -d\ -f2- | rev | tr '\n' ' '
20
+ echo $ff | rev | cut -d\ -f1 | rev | awk '{n=split($1,ar,"/");while(n>0){printf ar[n] "/";n--}printf "\n"}' |sed 's/\/$//'
21
+ done
22
+ ```

2

変更

2016/10/03 05:51

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -8,5 +8,5 @@
8
8
  awk '{for(i=1;i<NF+1;i++){if(i!=NF){if(i==2){printf"%2s",$i}\
9
9
  else if(i==3){printf"%10s",$i}else{printf" %s",$i}}else{n=split($i,ar,"/");\
10
10
  printf" ";while(n>0){printf ar[n] "/";n--}printf "\n"}}}' | \
11
- sed 's/\/$//'
11
+ sed -e 's/^ //' -e s/\/$//'
12
12
  ```

1

変更

2016/10/03 05:07

投稿

A.Ichi
A.Ichi

スコア4070

answer CHANGED
@@ -1,10 +1,12 @@
1
1
  完全に逆から表示であればrevコマンドが使えます。
2
2
 
3
3
  階層を逆順で表示ですが、良いコマンドが見つからなかったのでawk
4
+ 修正してみました
4
5
  ```bash
5
6
  #!/bin/sh
6
- find /usr/local -printf "%M %2n %10s %TY-%Tm-%Td %TH:%TM %p\n" | \
7
+ find /usr/local -printf "%M %n %s %TY-%Tm-%Td %TH:%TM %p\n" | \
8
+ awk '{for(i=1;i<NF+1;i++){if(i!=NF){if(i==2){printf"%2s",$i}\
7
- awk '{for(i=1;i<NF+1;i++){if(i!=NF){printf $i" "}else{n=split($i,ar,"/");\
9
+ else if(i==3){printf"%10s",$i}else{printf" %s",$i}}else{n=split($i,ar,"/");\
8
- while(n>0){printf ar[n] "/";n--}printf "\n"}}}' | \
10
+ printf" ";while(n>0){printf ar[n] "/";n--}printf "\n"}}}' | \
9
11
  sed 's/\/$//'
10
- ```
12
+ ```