2016-02-27 64 views
0

我想将具有相同列和数据类型的3个(说)文件的数据合并到一个文件中,我可以进一步使用这些文件进行处理。
目前我必须一个接一个地处理文件。所以,我正在寻找一种解决方案,我可以在脚本中编写一个将所有文件合并到一个文件中的解决方案。
对于前:
文件1:在unix shell脚本中将多个文件组合成单个文件

mike,sweden,2015 
tom,USA,1522 
raj,india,455 

文件2:

a,xyz,155 
b,pqr,3215 
c,lmn,3252 

预计合并后的文件3:

mike,sweden,2015 
tom,USA,1522 
raj,india,455 
a,xyz,155 
b,pqr,3215 
c,lmn,3252 

请帮助我。

+1

对文件结合方式有任何附加限制,例如:排序?因为如果没有,'猫'和'>'/'>>'输出重定向应该做你需要的。 – Lars

+0

请[请正确格式化您的示例数据](http://meta.stackexchange.com/a/22189/248777)。 – mklement0

+0

我觉得恶魔想要将两个文件水平不垂直。 – Hun

回答

0

问题的答案的原始形式: 作为@Lars在关于这个问题的意见状态,它看起来像一个简单的级联输入文件需要,这正是cat是(甚至命名为):

cat file1 file2 > file3 

为了满足您后来添加的要求:

#!/bin/sh 

# Concatenate the input files and sort them with duplicates removed 
# and save to output file. 
cat "$1" "$2" | sort -u > "$3" 

但是请注意,你可以结合级联和整理到一个步骤,这表现在Jean-Baptiste Yunès's answer

# Sort the input files directly with duplicates removed and save to output file. 
sort -u "$1" "$2" > "$3" 

注意使用sort是消除重复最简单的方法。 如果你不想排序,你将不得不使用一种不同的,更复杂的方法,例如,与awk

#!/bin/sh 

# Process the combined input and only 
# output the first occurrence in a set of duplicates to the output file. 
awk '!seen[$0]++' "$1" "$2" > "$3" 

!seen[$0]++是一种常见的awk成语仅打印首先在一组重复的:

  • seen是填充每个输入行关联数组($0 )作为键(索引),每个元素都按需创建。

  • 这意味着,从一组重复的(即使不相邻的)所有行指的是相同的数组元素。

  • 在数值方面,awk的变量值和数组元素隐含0,所以,当一个给定的输入线被看作用于首次和后递减(++)被施加,将所得值的元素是1

  • 只要稍后遇到该行的副本,就会增加数组元素的值。
  • 的净效应是,对于任何给定的输入线,如果输入线被看作用于第一时间!seen[$0]++返回,和它的每个重复的,如果有的话。请注意,++,由于增量,仅适用!seen[$0]进行了评估。

    • !否定seen[$0]的值,导致的0的值 - 其为在布尔上下文返回,任何非零值(重复遇到)返回
  • !seen[$0]++是实例的所谓图案awk - 针对其确定相关联的动作(代码块)是否应被处理的输入线进行评价的条件。这里没有任何动作,这种情况下awk含蓄地简单地打印输入行,如果!seen[$0]++指示

  • 总体效果如下:行按输入顺序打印,但对于重复行只打印第一个实例,有效地消除重复。

请注意,由于大部分数据必须保存在内存中,因此大数据量的重复输入文件很少会出现此问题。

+0

感谢您的回复,但我想将文件名作为参数传递给脚本,因为我希望在组合文件中找到重复记录。 – Demon

+0

基本上,在选择说文件1和文件2进行组合后,我想将这两个名称传递给组合文件名称(由我指定的名称)的脚本,同时尝试去重复数据组合文件。 – Demon

0

如果你的文件命名约定是相同的(比如file1,file2,file3 ... fileN),那么你可以用它来组合所有的。

cat file* > combined_file 

编辑:脚本做同样的假设您正在传递文件名作为参数

#!/bin/sh 
cat $1 $2 $3 | uniq > combined_file 

现在你可以,如果你想显示combined_file。或直接访问它。

+0

感谢您的答复,但我想将文件名作为参数传递给脚本,因为如果在组合文件中找到了重复记录,我想消除这些重复记录。 \t \t 基本上,在选择说文件1和文件2进行组合后,我想将这两个名称传递给组合文件名称(由我指定的名称)的脚本,同时尝试去重复组合文件中的数据。 – Demon

+0

检查编辑答案 – Utsav

+2

'uniq'只消除了相邻的相同行,你需要先排序。数据可以分类吗? –

1

喜欢的脚本:

#!/bin/sh 
sort "$1" "$2" | uniq > "$3" 

应该做的伎俩。 Sort将排序两个文件的连接(脚本的两个第一个参数),将结果传递给uniq,这将删除相邻的相同行并将结果推送到第三个文件(脚本的第三个参数)中。

+1

++用于显示不需要'cat'(您可以将多个文件直接传递给'sort');考虑使用'sort -u'而不是涉及'uniq'。 – mklement0

相关问题