使用剪裁重新排列列

我有以下格式的文件

 Column1 Column2
 str1 1
 str2 2
 str3 3

我想要重新排列这些列。 我尝试了下面的命令

剪下-f2,1 file.txt

该命令不重新排列列。 任何想法为什么它不工作?

谢谢。

对于cut(1)手册页:

使用一个,只有一个-b,-c或-f。 每个LIST由一个范围组成,或者由逗号分隔的许多范围组成。 所选input的写入顺序与读取的顺序相同,只写一次。

它先到达字段1,然后打印,然后是字段2。

awk代替:

 awk '{ print $2 " " $1}' file.txt 

您也可以结合cutpaste

 paste <(cut -f2 file.txt) <(cut -f1 file.txt) 

我不知道,如果多余的file参数可以巧妙地避免。

只用壳,

 while read -r col1 col2 do echo $col2 $col1 done <"file" 

你可以使用Perl:

 perl -ane 'print "$F[1] $F[0]\n"' < file.txt 
  • -e选项意味着执行后面的命令
  • -n表示逐行读取(打开文件,在这种情况下为STDOUT,并循环遍历行)
  • – 意思是将这样的行分割成一个称为@F(“F” – 如Field)的向量。 Perl从0开始索引向量,而不是从哪个索引字段开始从1开始。
  • 您可以添加-F 模式 (在-F和模式之间没有空格)在读取文件时使用模式作为字段分隔符,而不是默认的空格

运行Perl的好处是(如果你知道Perl),你可以比重新安排列做更多的计算。

刚刚一直在做一些非常相似的事情,我不是专家,但我想我会分享我用过的命令。 我有一个多栏csv,我只需要4列,然后我需要重新sorting。

我的文件是pipe道'|' 分隔但可以换出。

 LC_ALL=C cut -d$'|' -f1,2,3,8,10 ./file/location.txt | sed -E "s/(.*)\|(.*)\|(.*)\|(.*)\|(.*)/\3\|\5\|\1\|\2\|\4/" > ./newcsv.csv 

无可否认,这是非常粗糙和准备,但可以调整,以适应!

我用这个简短的Python脚本在这个问题的下面发布了另一个解决scheme,这个脚本在很多列上使用得更好: https : //stackoverflow.com/a/43676596/4928212