首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >sed:将x,y,z值的3列按x,y和z的顺序合并为1列。

sed:将x,y,z值的3列按x,y和z的顺序合并为1列。
EN

Stack Overflow用户
提问于 2013-01-28 06:11:22
回答 2查看 125关注 0票数 1

同样,我有大约150个没有头的数据的文件

x1 y1 z1 x2 y2 z2 ..。 锌锌

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

x1 x2 x3 ..。 xn y1 y2 y3 ..。 yn z1 z2 z3 。。 锌

任何想法都将不胜感激。

注:我以前发过类似的问题,而不是重复。请看这个link

致以敬意,

伊克尔

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-01-28 06:36:53

我不认为sed是这份工作的最佳工具。想到的最简单的解决方案只是三次使用cut

代码语言:javascript
复制
cut -f1 file && cut -f2 file && cut -f3 file

file含量

代码语言:javascript
复制
x1  y1  z1
x2  y2  z2
x3  y3  z3
xn  yn  zn

结果:

代码语言:javascript
复制
x1
x2
x3
xn
y1
y2
y3
yn
z1
z2
z3
zn

对于批处理文件,假设您的当前工作目录中只有感兴趣的文件:

代码语言:javascript
复制
for i in *; do 
    cut -f1 "$i" >> "$i.bak"
    cut -f2 "$i" >> "$i.bak"
    cut -f3 "$i" >> "$i.bak"

    mv "$i.bak" "$i"
done
票数 1
EN

Stack Overflow用户

发布于 2013-01-28 06:35:19

我希望你不会对perl过敏..。

此解决方案适用于具有任意数量列的文件:

代码语言:javascript
复制
$ 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块。

解剖学:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14556376

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档