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
から返される場合は、現在のレコードを印刷し続けていることを確認してください。読み取りに失敗した場合、変更は行われません。EOF
after.txt
||1
$0
after.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