1

同样,我有大约 150 个文件,其中包含以下数据,没有标题

x1 y1 z1

x2 y2 z2

...

锌合金

分隔符恰好是制表键。我如何对这 150 个文件使用 sed 和批处理来实现以下输出:

x1

x2

x3

...

xn

y1

y2

y3

...

z1

z2

z3

..

任何想法,将不胜感激。

注意:我之前发布了类似的问题,不重复。请看这个链接

问候,

伊克尔

4

2 回答 2

1

我希望你不会对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
于 2013-01-28T06:35:19.823 回答
1

我认为这不是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
于 2013-01-28T06:36:53.933 回答