2つのテキストファイルと1つのシェルスクリプトを繰り返す必要があります。

2つのテキストファイルと1つのシェルスクリプトを繰り返す必要があります。

私の最初のファイルには、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.txt2番目の文字に置き換えます。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もっと学ぶ。

おすすめ記事