我有 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
,并在其前面打印一个空行。对于其他行,我们正常打印。