Mac端末のファイルセットでコードを実行する

Mac端末のファイルセットでコードを実行する

.txtファイルを変更するスクリプトがあります。

これは私のスクリプトです。

awk 'BEGIN{FS=OFS="\t"}{split($1,a,"_"); split(a[3],b,"/"); print a[1],a[2],b[1],b[2],$0}' file.txt | awk 'BEGIN{FS=OFS="\t"}{split($18,a,";"); split(a[2],b,"="); print b[2],$0}' > out_file.txt 

私のフォルダにファイルがたくさんあります。

私のファイルからこのスクリプトを実行し、元のファイル名で各出力を返したいと思います。

私はこれを試しました

 > for  i in `find . -maxdepth 1 -type f -iname "*.txt" awk 'BEGIN{FS=OFS="\t"}{split($1,a,"_"); split(a[3],b,"/"); print a[1],a[2],b[1],b[2],$0}'| awk 'BEGIN{FS=OFS="\t"}{split($18,a,";"); split(a[2],b,"="); print b[2],$0}'print > out}' *.txt
-bash: syntax error near unexpected token `|'
(base) user112$

しかし、何も起こりませんでした。

答え1

for i in *.txt; do
    
    awk 'BEGIN{FS=OFS="\t"}{split($1,a,"_"); split(a[3],b,"/"); print a[1],a[2],b[1],b[2],$0}' $i | awk 'BEGIN{FS=OFS="\t"}{split($18,a,";"); split(a[2],b,"="); print b[2],$0}' > $i'_1'.txt
done

答え2

これはあなたがしたいことですか?

awk '
    BEGIN { FS=OFS="\t" }
    FNR == 1 {
        close(out)
        out = FILENAME "_1.txt"
    }
    {
        split($1,a,/_/)
        split(a[3],b,"/")
        $0 = a[1] OFS a[2] OFS b[1] OFS b[2] OFS $0
        split($18,a,/;/)
        split(a[2],b,/=/)
        print b[2], $0 > out
   }
' *.txt

別の名前で公開された以前の質問で示したように、シェルルーピングや複数のコマンドのパイピングは必要ありません。https://unix.stackexchange.com/a/605896/133219。繰り返しますが、やりたいことを行うより良い方法があるかもしれませんが、サンプル入力/出力がない場合は、スクリプトをコピーするだけです。

関連情報