在单个命令中组合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

...但是我更希望使用一个命令,因为我需要对它进行几次修改并稍作修改,因此运行一个命令比每次运行3个命令更容易出错。

有什么方法可以将2个cut语句组合为一个吗?就像是:

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

还是有更好的方法来做到这一点?

Answers:


8

使用sed

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

2341
BCDA
FGHE

11

使用cutpaste您还可以进行单线处理:

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

+1,表示粘贴快捷方式。这很容易理解。:)
Ankit

您也可以只使用-d ''而不是--delimiters=''重用LIST中的字符而不是TAB
rubo77


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

您可以根据数据通过“ -F”更改分隔符,并随意排列字段顺序。


1

这是一种方法perl

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

在字母边界自动分割,向左旋转一个并打印。


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

你尝试过转速吗?

~$ cat filename | rev


3
看一下示例输出。这不是纯粹的逆转,而是良好的思考。如果您无法提出一种重新处理此问题的方法,则应该删除它,以免它被拒绝投票并混淆线程。
slm
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.