我想知道如何交换与Linux的文件的列(确切的字符)(使用剪切,awk,sed或任何你可以帮助我)。 我已经看到如何交换整个表达式(使用分隔符)和整个单词。交换文件列 - Linux(确切的位置,不是字)
实施例:
128934
38 2008
交换柱3以5:
123984
3802 08
另一种方式问这个,将交换与第五每行的第三炭。
我想知道如何交换与Linux的文件的列(确切的字符)(使用剪切,awk,sed或任何你可以帮助我)。 我已经看到如何交换整个表达式(使用分隔符)和整个单词。交换文件列 - Linux(确切的位置,不是字)
实施例:
128934
38 2008
交换柱3以5:
123984
3802 08
另一种方式问这个,将交换与第五每行的第三炭。
有点笨重,具有SED:
$ sed -E 's/^(..)(.)(.)(.)/\1\4\3\2/' infile
123984
3802 08
此捕获四组的每一行的前五个字符,然后重新排列它们。 -E
只是为了方便;没有它,我们必须避开\(.\)
中的括号。
你可以用这个非POSIX complient例如与GAWK,mawk,NAWK和busybox的awk完成这件事:
awk -v FS='' -v OFS='' '{ t=$3; $3=$5; $5=t } 1' infile
输出:
123984
3802 08
你应该提到只适用于GNU awk(也许还有其他一些?),因为使用空字符作为FS来分割字符是每个POSIX未定义的行为。 gawk会做你想做的,但其他一些人肯定不会这么YMMV,但如果你有GNU工具,那么它是迄今为止最简单的方法。 –
@EdMorton:很高兴知道。我用gawk,mawk,nawk和busybox awk成功测试了它 – Thor
谢谢,运作良好。唯一的问题是在一个大文件中,如果我想改变第88个字符的第30个字符(只是一个例子)。你的答案中的团体(..)会是一些非常大的东西,例如(...... 29个点......),有没有办法重写这个,而不是做很多点? –
'。{10}'是例如十个字符。 –