同样,我有大约 150 个文件,其中包含以下数据,没有标题
x1 y1 z1
x2 y2 z2
...
锌合金
分隔符恰好是制表键。我如何对这 150 个文件使用 sed 和批处理来实现以下输出:
x1
x2
x3
...
xn
y1
y2
y3
...
因
z1
z2
z3
..
锌
任何想法,将不胜感激。
注意:我之前发布了类似的问题,不重复。请看这个链接。
问候,
伊克尔
我希望你不会对perl过敏...
此解决方案适用于具有任意列数的文件:
$ perl -ne 'BEGIN { @a = (); } $i = 0; foreach (split(/\s+/)) { $l = ($a[$i++] ||= []); push @$l, $_; }; END { print join("\n", @$_) . "\n" foreach (@a); }' << EOF
> x1 y1 z1
> x2 y2 z2
> x3 y3 z3
> x4 y4 z4
> EOF
x1
x2
x3
x4
y1
y2
y3
y4
z1
z2
z3
z4
我会评论,因为这不是很明显:
perl -n
逐行读取(准确地说,它读取和拆分$/
),并-e
执行一个小脚本;BEGIN
块在读取第一个输入之前执行,该END
块最后执行。解剖学:
BEGIN { @a = (); } # Creates an array named "a"
# Main scriptlet
$i = 0;
foreach (split(/\s+/)) { # Split an input line against one or more space chars
$l = # Set $l to...
($a[$i++] ||= []); # what is at index i of @a (increment i), but if not set,
# set to an (empty) array ref and return that
push @$l, $_; # Push token to the end of the array ref
}
END { # End block...
print join("\n", @$_) # Print the contents of array references, joined with \n,
. "\n" # then \n,
foreach (@a); # for each element of array a
} # DONE
我认为这不是sed
这项工作的最佳工具。想到的最简单的解决方案只涉及使用cut
三次:
cut -f1 file && cut -f2 file && cut -f3 file
内容file
:
x1 y1 z1
x2 y2 z2
x3 y3 z3
xn yn zn
结果:
x1
x2
x3
xn
y1
y2
y3
yn
z1
z2
z3
zn
对于批处理文件,假设您当前的工作目录中只有感兴趣的文件:
for i in *; do
cut -f1 "$i" >> "$i.bak"
cut -f2 "$i" >> "$i.bak"
cut -f3 "$i" >> "$i.bak"
mv "$i.bak" "$i"
done