使用剪裁重新排列列
我有以下格式的文件
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
您也可以结合cut
和paste
:
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