.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。繰り返しますが、やりたいことを行うより良い方法があるかもしれませんが、サンプル入力/出力がない場合は、スクリプトをコピーするだけです。