基于另一个文件在同一位置引入换行符

基于另一个文件在同一位置引入换行符

我有 3 个输入文件,它们的行数都相同。我想出了一个电影例子来让这个问题看起来很有趣。

file1.txt——本质上包含演员姓名。

1234|jacknicholson|actor
5678|jacknicholson|director
4321|christianbale|actor

file2.txt——包含演员的电影。

1234|oneflewovercuckoosnest^asgoodasitgets
5678|theshining
4321|batmanbegins^darkknight

file3.txt——演员的住所。

1234|california
5678|hollywoodstudios
4321|losangeles

我根据以下条件拆分第一个输入文件:如果名称相等,我需要应用一些算法。命令如下。

awk -F '|' 'NR>1 && $2 != prev {print ""} {prev=$2; print}' file1.txt

上面的命令将使我的第一个文件 ( file1.txt) 为,

1234|jacknicholson|actor
5678|jacknicholson|director

4321|christianbale|actor

我还需要在其余 2 个文件中的相同位置引入空格,以便我可以应用我的算法。

我想到的一种方法是将空格的位置存储在file1.txt一个数组中,然后当我在其余 2 个文件中遇到该位置时,引入空格。

答案1

要在文件中与 actor 中的更改相同的位置引入空行file1.txt,请尝试:

$ awk -F '|' '{save=$0; getline<"file1.txt"} NR>1 && $2!=prev {print ""} {prev=$2; print save}' file2.txt
1234|oneflewovercuckoosnest^asgoodasitgets
5678|theshining

4321|batmanbegins^darkknight

上面的代码与您的代码非常相似,只是它被扩展为同时读取两个文件。它读取该file2.txt行并将其保存在变量中save。然后,如果从 读取file.txt,并使用与代码相同的逻辑,确定参与者是否更改,如果更改,则打印换行符。然后它打印从 接收到的行file2.txt

答案2

另一个awk解决方案:

$ awk 'FNR==NR{if(!NF){a[FNR]=1}next}a[FNR]{print"\n"$0;next}{print}' file1.txt file2.txt
1234|oneflewovercuckoosnest^asgoodasitgets
5678|theshining

4321|batmanbegins^darkknight
  • 读取时,如果行为空,file1.txt我们在数组中标记行号。a
  • 读取时file2.txt,我们得到数组中空白的行号 a,并在其前面打印一个空行。对于其他行,我们正常打印。

相关内容