1つのコマンドで2つの異なるカット出力を組み合わせますか?


15

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

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つのカットステートメントを1つに結合する方法はありますか?何かのようなもの:

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

または、これを行うためのより良い方法はありますか?

回答:


8

を使用してsed

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

2341
BCDA
FGHE

11

cutし、pasteあなたもワンライナーを行うことができます。

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

+1、貼り付けのショートカット用。簡単に理解できます。:)
アンキット

TABの代わりにLISTの文字を再利用する-d ''代わりに使用することもできます--delimiters=''
-rubo77


3
$ cat test
1234
ABCD
EFGH
$ awk -F "" '{print $2$3$4$1}' test
2341
BCDA
FGHE

データに応じて「-F」でセパレータを変更し、フィールドの順序を任意に並べ替えることができます。


1

以下に1つの方法を示しperlます。

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

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


0

スクリプトの方法で別の方法を見つけました。

~$ cut -c2- file.txt>file2.txt
~$ cut -c1 file.txt>file3.txt
~$ paste -d "" file2.txt file3.txt>file4.txt
~$ rm file2.txt file3.txt

スクリプトは、チェーンを個別のファイルにカットします。次に、新しいファイル(file4.txt)に参加し、最後にスペアファイルを削除します。

lluaソリューションは、私の好みによりきれいです。


-1

revを試しましたか?

~$ cat filename | rev


3
サンプル出力を見てください。それは純粋な逆ではありませんが、良い考えです。これをやり直す方法が思いつかない場合は、おそらくそれを削除する必要があります。そうすることで、ダウンボーとスレッドを混乱させないようにするためです。
slm
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.