some.txtファイルがあります
-rwxrw-r-- 1 ivamshky ivamshky 152 Apr 2 00:42 12.sh~
-rw-rw-r-- 1 ivamshky ivamshky 58 Apr 6 19:03 a.c
-rw-rw-r-- 1 ivamshky ivamshky 98 Apr 1 20:27 all.sh
-rwxrwxr-x 1 ivamshky ivamshky 8509 Apr 6 19:04 a.out
-rw-rw-r-- 1 ivamshky ivamshky 46 Apr 6 19:07 a.py
-rw-rw-r-- 1 ivamshky ivamshky 399 Apr 18 00:37 attendance.csv
-rw-rw-r-- 1 ivamshky ivamshky 341 Apr 20 01:08 attendance.sh
-rw-rw-r-- 1 ivamshky ivamshky 0 Apr 19 16:21 awk
-rw-rw-r-- 1 ivamshky ivamshky 212 Apr 20 01:41 awktest.sh
現在のディレクトリのファイル名が上記のファイルに存在する場合は、「FOUND」を使用してその行に新しい列を追加したいと思います。例: awktest.sh が pwd に存在する場合。その後、出力は次のようになります。
-rw-rw-r-- 1 ivamshky ivamshky 212 Apr 20 01:41 awktest.sh FOUND
私はこのスクリプトを書いた。 (助けてくれてありがとう)
#!/bin/bash
for fn in *
do
n=$( awk -v fn="$fn" '$0 ~ fn { print NR }' some.txt )
awk -v n="$n" 'NR==n { $(NF+1)="Found" }1' some.txt >some.out
done
ただし、出力ファイルには新しい列は追加されません。 (some.txtに存在するpwdファイルがいくつかあります。)
ベストアンサー1
コードは非常に複雑です。例えば
>> list=$(ls -l | awk 'NR > 1 { print $9;}')
>> for fn in $list
なぜこれを実行してls -l
から$9
(ファイル名 - しかし、これはファイル名にスペースがない場合にのみ機能するのか)を抽出する必要があります。
for fn in *
次に、grep
行番号とフィールド抽出のためのawk
いくつかのタスクを実行します。
>> n=`grep -n "$fn" some.txt | awk -F":" '{ print $1;}'`
awk
しかし、単に一致するようにしておくのはどうですか?
n=$( awk -v fn="$fn" '$0 ~ fn { print NR }' some.txt )
最後に、引用符を使用してシェルとawkの間を前後に切り替えないでください。
>> awk -F" " 'NR=='"$n"'{OFS=" "; $(NF+1)="Found";}1' some.txt>some.out
変数を次の引数にきちんと渡します。
awk -v n="$n" 'NR==n { $(NF+1)="Found" } 1'
次に、次の部分を1つにまとめます。
for fn in *
do
n=$( awk -v fn="$fn" '$0 ~ fn { print NR }' some.txt )
awk -v n="$n" 'NR==n { $(NF+1)="Found" } 1' some.txt >some.out
mv some.out some.txt
done
これが正確に必要なものかどうかはわかりませんが、コードがよりきれいで、少なくとも問題が少なくなります。今回の改編で、これらすべてを一度に処理できる
ようです。awk
(しかし私はそれを読者の練習問題として残しています。)