如何合并2个文件并根据第一个数字对其行进行分组

时间:2015-12-01 17:38:21

标签: bash command-line-interface

我有2个文件:

1 "aaa"
2 "bbb"
4 "ddd"
3 "ccc"

1 "111"
3 "333"
4 "444"

如何使用bash合并到一个文件中,看起来完全像这样:

file1 "1 "aaa""
file2 "1 "111""

file1 "2 "bbb""
file2 ""

file1 "3 "ccc""
file2 "3 "333""

file1 "4 "ddd""
file2 "4 "444""

我正在考虑使用数组,但到目前为止,我设法只找到了解析整个行的数组。

我需要根据第一个数字进行分组。

此外,我希望能够在文件中添加一些文字。

到目前为止,我有这个脚本:

exec 6<"key-value-strings-utf8-preklad.txt"
while read -r line
do
    read -r f2line <&6
    echo "msgid \"${line}\""
    echo "msgstr \"${f2line}\""
    echo ""
done <"key-value-strings-utf8.txt"
exec 6<&-

问题是,它要求两个文件的排序完全相同。

你有线索吗?

我的目的是合并2个文件(一个用英文,一个用捷克语)并从中创建gettext po文件,这样我就可以进行翻译来帮助一些人(有点复杂的解释,但到目前为止似乎是最好的选择)对我来说。)

不幸的gettext工具无济于事,因为它们包裹行(即使使用--no-wrap,然后消息在/ n之后被包装),我需要将它们解包。

谢谢。

2 个答案:

答案 0 :(得分:1)

使用awk将文件与文件名组合,然后进行适当的排序:

awk '{print ARGV[ARGIND]": "$0}' file1 file2 | sort -k 2n -k 1,1

这不会插入“缺失”匹配的空白,但你可以想出来。

答案 1 :(得分:0)

如果每个索引中的空格和顺序不重要,sort应该完成任务。

cat file1 file2 | sort

...会给你:

 1 "111"
 1 "aaa"
 2 "bbb"
 3 "333"
 3 "ccc"
 4 "444"
 4 "ddd"

如果您确实需要索引之间有空行,或者您需要在每个索引中保留顺序,

这样的东西
x=1
while [ $x -lt 9999 ]; do
  (cat file1 file2 | grep "^$x" && echo) | tee -a file3
  x=$((x+1))
done

会给你:

1 "aaa"
1 "111"

2 "bbb"

3 "ccc"
3 "333"

4 "ddd"
4 "444"