我有一个 40 行的文件,如下所示:
0001.Group admin_group
0001.Users adam, sam, paul, david, jennifer, harry
0002.Group Dev_group
0002.Users mike, pauli, gary, sherry
0003.Group Sec_group
0003.Users david, diana, mike, paul, harry
0004.Group Main_group
0004.Users wilson, robert, samule
我需要使用前缀提取组和用户,并创建一个与组同名的新文件。
应该看起来像这样:
输出文件名:
admin_group
,内容:0001.Group admin_group 0001.Users adam, sam, paul, david, jennifer, harry
输出文件名:
Dev_group
,内容:0002.Group Dev_group 0002.Users mike, pauli, gary, sherry
最后,我需要 20 个新的文本文件。我尝试使用 sed 和 awk 创建两个单独的文件,但失败了。我怎样才能在 Bash 或 Python 中得到这个?
答案1
和awk
:
$ awk -v FS="\t" '$1 ~ /Group/ { file = $2 } { print $0 > file }' input.txt
awk
Group
检查第一列中是否有。如果是这种情况,我们将第二列的值存储在变量中file
。
检查后,整行将被打印并重定向>
到一个文件,其名称存储在变量中file
。
答案2
我们可以使用sed
编辑器对输入文件运行 2 遍。第一遍生成要在第二遍中使用的 sed 命令列表,以生成所需的输出。
$ sed -ne '
s/.*[[:blank:]]//
s|.*|/&/{N;w &\n}|w sed_code
n
' input-file.txt
那么这是第二遍。假设要创建的文件名不包含任何正则表达式特殊字符。
$ sed -nf sed_code input-file.txt
我们还可以部署 Perl 来完成此任务:
$ perl -aMautodie -pe '
open my $fh, ">", $F[1];
$_ .= <>;
select $fh;
' input.txt
答案3
不像 awk 版本那么聪明,但这里有一个替代方案。
497844.txt 是您的文件名。我已经使用了问题编号
for f in `cut -f1 -d. 497844.txt | sort | uniq`
do
group=`grep $f.Group 497844.txt`
fn=`echo $group| cut -f2 -d" "`
grep ^$f 497844.txt > $fn
done
解释。
对于每个唯一的组号,我们得到文件名,它是包含组的行的值。
然后,我们提取包含该组号的每一行,并将输出重定向到上面导出的文件中。