2017-08-04 94 views
1

我想知道如何交换与Linux的文件的列(确切的字符)(使用剪切,awk,sed或任何你可以帮助我)。 我已经看到如何交换整个表达式(使用分隔符)和整个单词。交换文件列 - Linux(确切的位置,不是字)

实施例:

128934 
38 2008 

交换柱3以5:

123984 
3802 08 

另一种方式问这个,将交换与第五每行的第三炭。

回答

1

有点笨重,具有SED:

$ sed -E 's/^(..)(.)(.)(.)/\1\4\3\2/' infile 
123984 
3802 08 

此捕获四组的每一行的前五个字符,然后重新排列它们。 -E只是为了方便;没有它,我们必须避开\(.\)中的括号。

+0

谢谢,运作良好。唯一的问题是在一个大文件中,如果我想改变第88个字符的第30个字符(只是一个例子)。你的答案中的团体(..)会是一些非常大的东西,例如(...... 29个点......),有没有办法重写这个,而不是做很多点? –

+0

'。{10}'是例如十个字符。 –

2

你可以用这个非POSIX complient例如与GAWK,mawk,NAWK和busybox的awk完成这件事:

awk -v FS='' -v OFS='' '{ t=$3; $3=$5; $5=t } 1' infile 

输出:

123984 
3802 08 
+2

你应该提到只适用于GNU awk(也许还有其他一些?),因为使用空字符作为FS来分割字符是每个POSIX未定义的行为。 gawk会做你想做的,但其他一些人肯定不会这么YMMV,但如果你有GNU工具,那么它是迄今为止最简单的方法。 –

+0

@EdMorton:很高兴知道。我用gawk,mawk,nawk和busybox awk成功测试了它 – Thor