我有两份文件:
档案-1
1 2 3 4
1 2 3 4
1 2 3 4 档案-2
0.5
0.5
0.5 现在我想将file-2的第1列添加到file-1的第3列中
输出
1 2 3.5 4
1 2 3.5 4
1 2 3.5 4 我试过了,但它不能正确地工作:
awk '{print $1, $2, $3+file-2 }' file-2=$1_of_file-2 file-1 > file-3 我知道awk语句是不对的,但是我想使用这样的语句,有人能帮我吗?
发布于 2014-09-04 05:56:46
你的数据不是很令人兴奋的…
awk 'FNR == NR { for (i = 1; i <= NF; i++) { line[NR,i] = $i } fields[NR] = NF }
FNR != NR { line[FNR,3] += $1
pad = ""
for (i = 1; i <= fields[FNR]; i++) { printf "%s%s", pad, line[FNR,i]; pad = " " }
printf "\n"
}' file-1 file-2第一个模式与第一个文件中的行匹配;它将每个字段保存到伪多维数组line中,并记录该行中有多少字段。
第二种模式与第二个文件中的行相匹配;它将第一列中的值添加到保存的数据的第三列,然后打印出在它们之间有空格的所有字段,并向末尾添加一条换行符。
给定这个(轻度)修改后的输入,脚本(保存在文件so-25657951.sh中)产生如下输出:
$ cat file-1
1 2 3 4
2 3 6 5
3 4 9 6
$ cat file-2
0.1
0.2
0.3
$ bash so-25657951.sh
1 2 3.1 4
2 3 6.2 5
3 4 9.3 6
$请注意,因为这会在读取第二个文件之前将整个第一个文件放入内存,因此输入文件不应该太大(例如,亚千兆字节大小)。如果它们比这更大,你可能应该设计一种替代策略。
例如,有一个getline函数(即使在POSIX awk中),它可以用于从文件2中读取文件1中每一行的一行,然后您可以简单地打印数据,而不需要积累任何内容:
awk '{ getline add < "file-2"; $3 += add; print }' file-1这对于任何大小的文件来说都是相当干净的(只要文件有相同的行数--或者更准确地说,只要file-2至少有和file-1一样多的行)。
发布于 2014-09-04 06:46:35
这样做可能会奏效:
cat f1
1 2 3 4
2 3 6 5
3 4 9 6 cat f2
0.1
0.2
0.3awk 'FNR==NR {a[NR]=$1;next} {$3+=a[FNR]}1' f2 f1
1 2 3.1 4
2 3 6.2 5
3 4 9.3 6在我发布之后,我确实看到了这与Jaypal在一条评论中的相同之处。
https://stackoverflow.com/questions/25657951
复制相似问题