スクリプトで awk を実行する際にエラーが発生しました。

スクリプトで awk を実行する際にエラーが発生しました。

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(しかし私はそれを読者の練習問題として残しています。)

おすすめ記事