在Linux中如何合并两个文件

3
我有两个文件file_A和file_B。文件file_A包含文件名,然后空格后是代码行。这个代码行可以有各种随机字符比如空格、冒号等等。它的样子像这样。请注意,文件中的代码行没有用括号括起来。这只是为了说明。
bash $ cat file_A
file_name1 (code line a)
file_name1 (code line b)
file_name2 (code line c)
file_name2 (code line d)
file_name2 (code line e)

文件file_B包含了在file_A中出现的文件名和频率。 bash$cat file_B
file_name1 2
file_name2 3

我想要的输出格式是:(频率,文件名,代码行)
2 file_name1 (code line a)
2 file_name1 (code line b)
3 file_name2 (code line c)
3 file_name2 (code line d)
3 file_name2 (code line e)

bash$ join -1 1 -2 1 file_B file_A > file_C

我得到的file_C文件内容如下(我将join字段作为第一列)

file_name1 2 (code line a)
file_name1 2 (code line b)
file_name2 3 (code line c)
file_name2 3 (code line d)
file_name2 3 (code line e)

如何在第一个字段中获取频率字段?
我知道使用join命令可以使用-o格式,并提及输出中想要的字段和顺序。但是,我该怎么说将所有内容放在代码行中(它可以包含任何内容,因此没有分隔符)?
谢谢。

请编辑您的问题并在编辑器中使用101010按钮以保留文件片段的格式。 - thkala
这个问题已经解决。我可以使用以下代码片段:#!/bin/kshawk ' { for (i=4; i<=NF; i++) printf("%s ", $i) printf("\n") # 行末换行符 } ' mydatafile - xyz
您可以将您的解决方案发布为答案,然后接受它。这样,来自Google的其他用户就可以清楚地看到解决方案是什么。 - jonescb
既然你已经找到了自己问题的答案,那么请将其发布为一个回答,而不是一个评论。这样可以让其他人对其进行点赞(如果他们喜欢)或批评(如果他们不喜欢)。同时,这也使得你的答案更易于阅读,以便其他可能有类似问题的人能够受益。你可以在一段时间后将自己的答案标记为被接受的答案。 - Gilles 'SO- stop being evil'
3个回答

3
join file_B file_A | awk '{t=$1; $1=$2; $2=t; print}' > file_C

1

注意,join不支持在输出格式中指定字段范围,因此以下方法有点巧妙,但支持在“代码行”中最多8个空格。

join -o 1.2,0,2.2,2.3,2.4,2.5,2.6,2.7,2.8,2.9 file_B file_A

0
sed 's#([^ ]*) ([^ ]*) (.*)#$2 $1 $3#g'

注意:也许你需要用反斜杠转义普通括号才能使其正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接