awkからパターンをコピーして次の行に貼り付けます。

awkからパターンをコピーして次の行に貼り付けます。

私のフォルダにはtxtファイルがたくさんあります。各ファイルにはこの形式の1行が含まれています。

8852 0.53451 0.55959 0.65494 0.36047

次の行に固定数字を追加し、残りの4つの列は以下のように元の行からコピーされます。

8852 0.53451 0.55959 0.65494 0.36047

9997 0.53451 0.55959 0.65494 0.36047

これまで、フォルダ内のコマンドを実行して9997を追加しました。

find *.txt -exec sh -c 'echo "9997" >> $0' {} \;

残りの4つの列をコピーしました。

for files in .; do awk '{$1=""; print substr($0,2)}' *.txt;done

ただし、各ファイルの次の行ではなく出力に印刷されます。

まだすべて整理できず、近づいたような感じもしますが、おそらく間違った方向かもしれません。私はawk '{print "\n"$2,$3,$4,$5}' を試しましたが、やはり動作しませんでした。

助けてくれてありがとう!ありがとうございます。

答え1

私はお勧めしますawk '{print; $1 = 9997; print}'

$ echo '8852 0.53451 0.55959 0.65494 0.36047' | awk '{print; $1 = 9997; print}'
8852 0.53451 0.55959 0.65494 0.36047
9997 0.53451 0.55959 0.65494 0.36047

複数のファイルに変換を適用すると述べました。ループを使用してこれを行うことができます。

for f in *.txt; do  awk '{print; $1 = 9997; print}' "$f"; done

または(再帰的に)使用find

find . -name '*.txt' -exec awk '{print; $1 = 9997; print}' {} \;

ただし、拡張子が . である最新バージョンの GNU Awk がない場合、結果はリンクされ、-i inplace標準出力に書き込まれます。

答え2

与えられたあなたのコメントファイルを更新したい場合は、変更in this directory and other directories next to it.したいファイルがある別のディレクトリがあるディレクトリがあるとします。最上位ディレクトリにCDをコピーした後に行う方法は次のとおりです。

find . -maxdepth 2 -mindepth 2 -exec awk -i inplace '{print} $1==8852{$1=9997; print}' {} +

上記は「内部」編集にはGNU awkを使用し、これにはGNU findを使用します+。 GNU ツールがない場合、ファイル名に改行文字が含まれていないと仮定します。

tmp=$(mktemp)
while IFS= read -r file; do
    awk '{print} $1==8852{$1=9997; print}' "$file" > "$tmp" &&
    mv "$tmp" "$file"
done < <(find . -maxdepth 2 -mindepth 2) )
rm -f "$tmp"

8852以下を含まないファイルのタイムスタンプを変更したくない場合:

tmp=$(mktemp)
while IFS= read -r file; do
    awk '$1==8852{f=1; exit} END{exit !f}' "$file" &&
    awk '{print} $1==8852{$1=9997; print}' "$file" > "$tmp" &&
    mv "$tmp" "$file"
done < <(find . -maxdepth 2 -mindepth 2) )
rm -f "$tmp"

答え3

したがって、多くのファイルがあり、次の形式の行があります。

8852 0.53451 0.55959 0.65494 0.36047

ここでファイルを開き、最初の列を選択した値に置き換え、残りはそのままにして次の行に追加しようとしています。

8852 0.53451 0.55959 0.65494 0.36047

9997 0.53451 0.55959 0.65494 0.36047

質問に正しく答えたら、次のことが機能します。

for file in ``find . -name "*.txt"``; do awk '{print "\n9997 "$2,$3,$4,$5}' $file >> $file; done

フォルダ内のすべてのファイルをインポートし、awkを使用してファイルを読み取り、2345列をインポートし、最初の列の値を追加して同じファイルに追加します。

私が質問を間違えた場合は謝罪します。

関連情報