私の最初のファイルには、screen.txt
次の単一文字が含まれています。
d
m
a
o
2番目のファイルbeta.txt
には複数行が含まれています。
cvvbbe
etgjiua
qwrfggo
3番目のファイルgama.sh
はシェルスクリプトです。
beta.txt
次のようにファイルを繰り返す必要があります。
- 各行の最後の文字を
beta.txt
最初の文字に置き換えます。screen.txt
- 救う
beta.txt
- 走る
gama.sh
- 各行の最後の文字を
beta.txt
2番目の文字に置き換えます。screen.txt
- 救う
beta.txt
- 走る
gama.sh
- など。
ベストアンサー1
awkを使用してください。
$ cat gama.sh
#!/usr/bin/env sh
awk '
NR==FNR {
beta[++nr] = substr($0,1,length($0)-1)
next
}
{
for ( i=1; i<=nr; i++ ) {
print beta[i] $0 > ARGV[1]
}
print "" > ARGV[1]
}
' "$@"
$ ./gama.sh beta.txt screen.txt
$ cat beta.txt
cvvbbd
etgjiud
qwrfggd
cvvbbm
etgjium
qwrfggm
cvvbba
etgjiua
qwrfgga
cvvbbo
etgjiuo
qwrfggo
上記は、内容がbeta.txt
メモリに収まらないほど大きくないと仮定しています。それ以外の場合は、内容がscreen.txt
メモリに収まる場合:
$ cat gama.sh
#!/usr/bin/env sh
tmp=$(mktemp) &&
awk '
BEGIN { OFS="\t" }
NR==FNR {
screen[++nr] = $0
next
}
{
$0 = substr($0,1,length($0)-1)
for ( i=1; i<=nr; i++ ) {
print i, FNR, $0 screen[i]
}
}
END {
for ( i=1; i<=nr; i++ ) {
print i, FNR+1
}
}
' "$@" |
sort -k1,2n |
cut -f3- > "$tmp" &&
mv -- "$tmp" "$2"
$ ./gama.sh screen.txt beta.txt
$ cat beta.txt
cvvbbd
etgjiud
qwrfggd
cvvbbm
etgjium
qwrfggm
cvvbba
etgjiua
qwrfgga
cvvbbo
etgjiuo
qwrfggo
2番目のスクリプトは、DSU(装飾/整列/装飾解除)イディオムを適用して、目的の順序で出力ラインを生成します。https://stackoverflow.com/questions/71691113/how-to-sort-data-based-on-the-value-of-a-column-for-part-multiple-lines-of-af/71694367#71694367もっと学ぶ。