単一のコマンドで2つの異なるカット出力を結合しますか?

単一のコマンドで2つの異なるカット出力を結合しますか?

次のファイルがあります。

1234
ABCD
EFGH

次のように変換したいと思います。

2341
BCDA
FGHE

実際のファイルには4,000語があるので、これを効率的に実行したいと思います。コマンドを試しましたが、cut -c 2-4,1 file.txt入力とまったく同じ出力が生成されます。私の考えでは、3つの異なるコマンドを使用できるようです。

cut -c 1 file.txt > temp1.txt
cut -c 2-4 file.txt > temp2.txt
// combine the two with paste or pr

...しかし、いくつかの修正を経て何度も実行する必要があるので、単一のコマンドを好みます。したがって、1つのコマンドを実行することは、毎回3つのコマンドを実行するよりもエラーの可能性が低くなります。

2つのcutステートメントを1つにまとめる方法はありますか?それは次のとおりです。

cut -c 1 file.txt | pr (cut -c 2-4 file.txt)

それとももっと良い方法がありますか?

答え1

以下を使用して、cut次のpaste行を実行することもできます。

$ cat file
1234
ABCD
EFGH
$ paste --delimiter=''  <(cut file -c2-4) <(cut file -c1)
2341
BCDA
FGHE

答え2

使用sed:

sed 's:^\(.\)\(.*\):\2\1:' file.txt

2341
BCDA
FGHE

答え3

Bashを使用している場合は、文字列インデックスを使用してください。パラメータ拡張:

while IFS= read -r word; do
  echo "${word:1:3}${word:0:1}"
done < file.txt

答え4

1つの方法は次のとおりですperl

perl -F'' -lane 'print @F[1..@F], $F[0]'

文字境界で自動的に分割し、1つを左に回転して印刷します。

関連情報