Bash 使用awk根据数据将文件拆分为不同的部分

Bash 使用awk根据数据将文件拆分为不同的部分,bash,awk,Bash,Awk,我需要使用awk将文件1中的数据分割成4美元的数据。目标文件名应取自映射文件2 文件1 文本;文本;文本;AB;文本 文本;文本;文本;AB;文本 文本;文本;文本;光盘文本 文本;文本;文本;光盘文本 文本;文本;文本;环境足迹;文本 文本;文本;文本;环境足迹;正文 文件2 AB;有效 光盘无效 环境足迹;未指定 所需输出,其中文件名在文件2中的值为$2 文件有效 文本;文本;文本;AB;文本 文本;文本;文本;AB;正文 文件无效 文本;文本;文本;光盘文本 文本;文本;文本;光盘正文 未

我需要使用awk将文件1中的数据分割成4美元的数据。目标文件名应取自映射文件2

文件1

文本;文本;文本;AB;文本
文本;文本;文本;AB;文本
文本;文本;文本;光盘文本
文本;文本;文本;光盘文本
文本;文本;文本;环境足迹;文本
文本;文本;文本;环境足迹;正文

文件2

AB;有效
光盘无效
环境足迹;未指定

所需输出,其中文件名在文件2中的值为$2

文件有效

文本;文本;文本;AB;文本
文本;文本;文本;AB;正文

文件无效

文本;文本;文本;光盘文本
文本;文本;文本;光盘正文

未指定文件

文本;文本;文本;环境足迹;文本
文本;文本;文本;环境足迹;正文


有关如何执行拆分的任何建议?

使用
awk

awk -F';' 'FNR==NR {a[$1]=$2;next} $4 in a {print > a[$4]}
           $4 != p {if (p) close(a[p]); p=$4}' file2 file1

使用
awk

awk -F';' 'FNR==NR {a[$1]=$2;next} $4 in a {print > a[$4]}
           $4 != p {if (p) close(a[p]); p=$4}' file2 file1

使用
awk

awk -F';' 'FNR==NR {a[$1]=$2;next} $4 in a {print > a[$4]}
           $4 != p {if (p) close(a[p]); p=$4}' file2 file1

使用
awk

awk -F';' 'FNR==NR {a[$1]=$2;next} $4 in a {print > a[$4]}
           $4 != p {if (p) close(a[p]); p=$4}' file2 file1

似乎只有代码的第一部分起作用:

awk -F';' 'FNR==NR {a[$1]=$2;next} $4 in a {print > a[$4]}' file2 file1 
那么,为什么最后一半代码是:

$4 != p {if (p) close(a[p]); p=$4

需要什么?谢谢

似乎只有代码的第一部分起作用:

awk -F';' 'FNR==NR {a[$1]=$2;next} $4 in a {print > a[$4]}' file2 file1 
那么,为什么最后一半代码是:

$4 != p {if (p) close(a[p]); p=$4

需要什么?谢谢

似乎只有代码的第一部分起作用:

awk -F';' 'FNR==NR {a[$1]=$2;next} $4 in a {print > a[$4]}' file2 file1 
那么,为什么最后一半代码是:

$4 != p {if (p) close(a[p]); p=$4

需要什么?谢谢

似乎只有代码的第一部分起作用:

awk -F';' 'FNR==NR {a[$1]=$2;next} $4 in a {print > a[$4]}' file2 file1 
那么,为什么最后一半代码是:

$4 != p {if (p) close(a[p]); p=$4

需要什么?谢谢

下次
awk
打开文件时,当您添加
close(…)
时,它将覆盖该文件。如果不关闭(…)很可能会有太多打开的文件出错。FWIW GNU awk为您处理文件关闭,因此无需手动操作。您可以在每次$4更改时关闭上一个输出文件,在这种情况下应该特别有效,因为输入看起来是按$4排序的。听起来不错,但是在条件
p&&&4!=p
因为它将停止
p
的填充,而
close(p)
p
未填充时将不起任何作用。哦,是的。我犯了一个愚蠢的错误。现在修好了。再次感谢。噢,它应该是
close(a[p])
而不是
close(p)
。下次
awk
打开文件时,当您添加
close(…)
时,它将覆盖该文件。如果不关闭(…)很可能会有太多打开的文件出错。FWIW GNU awk为您处理文件关闭,因此无需手动操作。您可以在每次$4更改时关闭上一个输出文件,在这种情况下应该特别有效,因为输入看起来是按$4排序的。听起来不错,但是在条件
p&&&4!=p
因为它将停止
p
的填充,而
close(p)
p
未填充时将不起任何作用。哦,是的。我犯了一个愚蠢的错误。现在修好了。再次感谢。噢,它应该是
close(a[p])
而不是
close(p)
。下次
awk
打开文件时,当您添加
close(…)
时,它将覆盖该文件。如果不关闭(…)很可能会有太多打开的文件出错。FWIW GNU awk为您处理文件关闭,因此无需手动操作。您可以在每次$4更改时关闭上一个输出文件,在这种情况下应该特别有效,因为输入看起来是按$4排序的。听起来不错,但是在条件
p&&&4!=p
因为它将停止
p
的填充,而
close(p)
p
未填充时将不起任何作用。哦,是的。我犯了一个愚蠢的错误。现在修好了。再次感谢。噢,它应该是
close(a[p])
而不是
close(p)
。下次
awk
打开文件时,当您添加
close(…)
时,它将覆盖该文件。如果不关闭(…)很可能会有太多打开的文件出错。FWIW GNU awk为您处理文件关闭,因此无需手动操作。您可以在每次$4更改时关闭上一个输出文件,在这种情况下应该特别有效,因为输入看起来是按$4排序的。听起来不错,但是在条件
p&&&4!=p
因为它将停止
p
的填充,而
close(p)
p
未填充时将不起任何作用。哦,是的。我犯了一个愚蠢的错误。现在修好了。再次感谢。哦,它应该是
close(a[p])
而不是
close(p)