在这里,我想帮助您修改文本文件。
我想修改文件中的文本(数百万列,制表符分隔) - 删除除第一个之外的所有选项卡,并在最后一列后面添加新列。
文件(这里有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混合使用。但是,我尝试了很多不同的方法,但我仍然不知道如何做到这一点。
你可以帮我一下吗?提前谢谢。最佳,
答案 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 -n
或awk
: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