Bash Shell脚本在剪切后覆盖列

Bash Shell脚本在剪切后覆盖列,bash,shell,Bash,Shell,我有一个csv文件,我在使用cut命令后更改了它的一些列 123;bbb ;10.01.2010 456;ddd;11.01.2015 789;aaa;20.12.2010 222;ccc;15.10.2010 例如,我得到第二列,根据下面的代码对其进行修剪和排序 cut -f 2 -d ';' data.csv | sed 's/^[ \t]*//;s/[ \t]*$//' | sort 如何用新值覆盖文件列,使同一文件变成如下所示 123;aaa;10.01.2010 456;bbb;

我有一个csv文件,我在使用cut命令后更改了它的一些列

123;bbb ;10.01.2010
456;ddd;11.01.2015
789;aaa;20.12.2010
222;ccc;15.10.2010 
例如,我得到第二列,根据下面的代码对其进行修剪和排序

cut -f 2 -d ';' data.csv | sed 's/^[ \t]*//;s/[ \t]*$//' | sort
如何用新值覆盖文件列,使同一文件变成如下所示

123;aaa;10.01.2010
456;bbb;11.01.2015
789;ccc;20.12.2010
222;ddd;15.10.2010 
输入

$ cat f
123;bbb ;10.01.2010
456;ddd;11.01.2015
789;aaa;20.12.2010
222;ccc;15.10.2010 
$ awk  'BEGIN{FS=OFS=";"}FNR==NR{sub(/ +/,"",$2);a[$2];next}FNR==1{asorti(a,b)}{$2=b[FNR]}1' f f
123;aaa;10.01.2010
456;bbb;11.01.2015
789;ccc;20.12.2010
222;ddd;15.10.2010 
使用
剪切、tr、排序和粘贴

$ paste -d ';' <(cut -f 1 -d ';'  f) <(cut -f 2 -d ';'  f | tr -d ' ' | sort) <(cut -f 3 -d ';'  f | sort)
123;aaa;10.01.2010
456;bbb;11.01.2015
789;ccc;15.10.2010 
222;ddd;20.12.2010
$ pr -mtJs';' <(cut -f 1 -d ';'  f) <(cut -f 2 -d ';'  f | tr -d ' ' | sort) <(cut -f 3 -d ';'  f | sort)
123;aaa;10.01.2010
456;bbb;11.01.2015
789;ccc;15.10.2010
222;ddd;20.12.2010
$ awk  'BEGIN{FS=OFS=";"}FNR==NR{sub(/ +/,"",$2);a[$2];next}FNR==1{asorti(a,b)}{$2=b[FNR]}1' f f
123;aaa;10.01.2010
456;bbb;11.01.2015
789;ccc;20.12.2010
222;ddd;15.10.2010 
使用
gawk
(推荐使用)

$ awk  'BEGIN{FS=OFS=";"}FNR==NR{sub(/ +/,"",$2);a[$2];next}FNR==1{asorti(a,b)}{$2=b[FNR]}1' f f
123;aaa;10.01.2010
456;bbb;11.01.2015
789;ccc;20.12.2010
222;ddd;15.10.2010 
解释(读取同一文件两次)

$ awk  'BEGIN{FS=OFS=";"}FNR==NR{sub(/ +/,"",$2);a[$2];next}FNR==1{asorti(a,b)}{$2=b[FNR]}1' f f
123;aaa;10.01.2010
456;bbb;11.01.2015
789;ccc;20.12.2010
222;ddd;15.10.2010 

提供最小的输入和预期的输出。欢迎使用堆栈溢出。请找个时间读一下这两页。不清楚“覆盖”步骤应该做什么。您能提供示例输入数据(5行就足够了)和所需的输出吗?
sed
步骤应该是不必要的(至少为了获得正确的排序顺序-您可能需要它来获得正确的演示文稿);您可以使用
-b
排序
来忽略前导空格。请阅读关于如何创建MCVE(),注意输入和输出是创建MCVE的要求的一部分。谢谢,我小心地编辑了我的问题,可以编写Awk脚本,这样它就不需要重新读取数据文件,而需要将整个文件存储在内存中。对于问题中的数据文件,重复扫描不是问题。如果输入来自管道或其他不可重复的源,则重新扫描不再是选项。基于
剪切
'n'
粘贴
的解决方案还取决于文件的输入,以便可以多次处理。这是一个很小的挑剔,不是一个主要的缺陷。@JonathanLeffler是的,可以在
END
块中处理,但是对于预期的o/p,我认为
$2=b[FNR]
读两遍会很容易