修改文件中的文本(数百万列,制表符分隔) - 删除除第一个以外的所有选项卡,并在最后一列后面添加新列

时间:2011-06-15 09:02:19

标签: linux perl unix sed awk

在这里,我想帮助您修改文本文件。

我想修改文件中的文本(数百万列,制表符分隔) - 删除除第一个之外的所有选项卡,并在最后一列后面添加新列。

  • 文件(这里有4列,但是 我的真实文件中有数百万列, 制表符分隔)我现在有:

    day1 1 3 7
    day7 2 4 8
    day3 2 5 6
    
  • 我想要的文件,删除分隔符 (从第二个),并添加三个 新列(一列与 第一个,另外两个相同 所有相同列中的值,此处为x 和y)。

    day1 137 day1 x y
    day7 248 day7 x y
    day3 256 day3 x y
    

我打算用awk和sed混合使用。但是,我尝试了很多不同的方法,但我仍然不知道如何做到这一点。

你可以帮我一下吗?提前谢谢。

最佳,

3 个答案:

答案 0 :(得分:2)

使用gawk -f script.awk < input > output包含的script.awk

{
    old=$1;
    $0 = substr($0, length($1)+1);
    gsub(/[[:space:]]*/, "", $0);
    print old, $0, old, "x", "y";
} 

观看直播演示here(感谢您belisarius向我展示此网站)

答案 1 :(得分:2)

问题标记为[perl],所以为了完整性:

#! /usr/bin/perl -lan

BEGIN { $, = "\t" }

$first = shift @F;
print $first, join("", @F), $first, qw/ x y /;

该程序使用了几个便利功能来保持简洁。

  • $,设置为一个TAB字符,与awk中的FS类似
  • -l切换为隐式添加"\n"到每个print,其工作方式类似于awk中的ORS
  • -a(autosplit或awk模式)开关
  与-n-p一起使用时,

会启用自动分割模式。对split数组的隐式@F命令是-n-p生成的隐式while循环中的第一个内容。

perl -ane 'print pop(@F), "\n";'
     

相当于

while (<>) {
  @F = split(' ');
  print pop(@F), "\n";
}
  • -n切换到隐式循环所有输入行
  

导致Perl在程序周围采用以下循环,这使得它迭代文件名参数,有点像sed -nawk

LINE:
while (<>) {
  ...  # your program goes here
}

答案 2 :(得分:1)

这可能对您有用:

sed 's/\t//2g;s/\(.*\t\)\(.*\)/&\t\1x\ty/' file
day1    137     day1    x       y
day7    248     day7    x       y
day3    256     day3    x       y

我猜测,因为它是一个制表符分隔文件,所以您希望新列以制表符分隔。如果不是:

sed 's/\t//2g;s/\(.*\)\t\(.*\)/& \1 x y/' file
day1    137 day1 x y
day7    248 day7 x y
day3    256 day3 x y