あるファイルのテキストを別のファイルのテキストに置き換える

あるファイルのテキストを別のファイルのテキストに置き換える

before.txt次の内容を含むファイルがあるとします。

1  
2  
3  
4

4しかし、数値を.txtというテキストファイルの数字(順番に)に置き換えたいと思いますafter.txt。どうすればいいですか?

after.txt含む:

2743
3028
2850
1092
etc.

これもスクリプトに置き換えることができますか?その場合は、すべての文字列を順番に繰り返し、上記のようにafter.txt文字列を置き換えたいと思います。4

答え1

awk '/^4$/&&getline<"after.txt"||1' before.txt

現在のレコードが$0正確にテキストの場合は、4次の行を取得しますafter.txt。成功すると 1 になり、$0返されるgetlineため、式は true で、{print}基本操作がトリガーされます。

レコードが存在しない場合4、または getline が of0から返される場合は、現在のレコードを印刷し続けていることを確認してください。読み取りに失敗した場合、変更は行われません。EOFafter.txt||1$0after.txt

getline失敗してもゼロ以外の戻りコードであるため、-1印刷を続けます。$0

答え2

次のファイルが与えられた場合:

cat before.txt 
1  
2  
3  
4
1  
1  
2  
3  
4
2  
3  
4

cat after.txt
2743
3028
2850
1092

そして、この小さなスクリプトは次のようになります。

#!/bin/bash

while read -r line; do
    if [[ "$line"  == 4 ]]; then
        sed -n '1p' after.txt
        sed -i".bup" '1d' after.txt 
    else
        echo "$line"
    fi  
done < before.txt

私は次のような結果を得ます。

./script.sh 
1
2
3
2743
1
1
2
3
3028
2
3
2850

これを行うオネライナーがあると確信していますawkが、流暢ではありませんawk!また、ファイルを置き換え(「所定の位置」)するには、ループ内のステートメントをbefore.txt変更する必要があります。sedそれ以外の場合は、単にSTDOUT新しいファイルにリダイレクトできます。この場合は、見やすくSTDOUTするためにすべてのコンテンツを印刷することにしました。


テスト中OSX 10.11.6そしてBSDsed

答え3

awkにも似ていますか?

$ awk 'NR==FNR{Arr[NR]=$0;next}{if($0==4){i++;print Arr[i]}else{print}}' after.txt before.txt
1
2
3
2743
1
1
2
3
3028
2
3
2850

関連情報