Linux 创建文件所需的awk sed帮助

Linux 创建文件所需的awk sed帮助,linux,bash,sed,awk,tr,Linux,Bash,Sed,Awk,Tr,嗨,我有一个输入文件和条目。每行以主机名host1、host2开头。 我需要在主机名后创建一个文件名,该文件名将包含冒号后每行的条目列表。有人能帮忙吗?请参见下面的示例 输入文件 host1*stop*start : runit stopit gather host2*stop*start : unite cease cut chop eat 输出文件名host1 runit stopit gather 输出文件名host2 unite cease cut chop eat

嗨,我有一个输入文件和条目。每行以主机名host1、host2开头。 我需要在主机名后创建一个文件名,该文件名将包含冒号后每行的条目列表。有人能帮忙吗?请参见下面的示例

输入文件

host1*stop*start : runit stopit gather 
host2*stop*start : unite cease cut chop eat
输出文件名host1

runit 
stopit 
gather 
输出文件名host2

unite 
cease 
cut 
chop 
eat
上面使用空格作为字段分隔符。因此,对于第一个示例行,第一个字段是host1*stop*start,第二个字段是:,其余字段是:runit、stopit、gather。我们首先需要从第一个字段中提取主机名。我们通过在字符*上拆分该字段来实现这一点,该字符*将主机名放入变量数组[1]。然后,我们将第三个字段及其后的所有字段作为单独的行写入名为array[1]的文件

上面使用空格作为字段分隔符。因此,对于第一个示例行,第一个字段是host1*stop*start,第二个字段是:,其余字段是:runit、stopit、gather。我们首先需要从第一个字段中提取主机名。我们通过在字符*上拆分该字段来实现这一点,该字符*将主机名放入变量数组[1]。然后,我们将第三个字段及其后的所有字段作为单独的行写入以数组[1]命名的文件。

仅使用内置项:

while IFS=: read -a ln; do
    printf "%s\n" ${ln[@]:1} > "${ln[0]%%\**}"
done < file.txt
读取:上的每一行并将其拆分为一个数组 数组的第0个元素将是host1*stop*start。通过使用参数扩展删除每个*和以下所有文本,将其转换为所需的文件名 所有剩余元素将是一个以空格分隔的列表。这将传递给printf,printf将根据其格式说明符格式化该列表的每个成员 printf输出被重定向到上面生成的文件名 仅使用内置组件:

while IFS=: read -a ln; do
    printf "%s\n" ${ln[@]:1} > "${ln[0]%%\**}"
done < file.txt
读取:上的每一行并将其拆分为一个数组 数组的第0个元素将是host1*stop*start。通过使用参数扩展删除每个*和以下所有文本,将其转换为所需的文件名 所有剩余元素将是一个以空格分隔的列表。这将传递给printf,printf将根据其格式说明符格式化该列表的每个成员 printf输出被重定向到上面生成的文件名 使用perl:

谨此陈辞: perl-lane“在空间上拆分行并将它们加载到数组中 $,=\n;将输出列表分隔符设置为换行符 $F[0]=~/[^*]+/;从第一个数组索引捕获文件名 openO,>1美元;使用捕获的组打开文件名为的文件句柄 打印O@F[2..$F];打印文件中从第三个索引到行尾的所有内容 Close关闭文件句柄 "档案" 使用perl:

谨此陈辞: perl-lane“在空间上拆分行并将它们加载到数组中 $,=\n;将输出列表分隔符设置为换行符 $F[0]=~/[^*]+/;从第一个数组索引捕获文件名 openO,>1美元;使用捕获的组打开文件名为的文件句柄 打印O@F[2..$F];打印文件中从第三个索引到行尾的所有内容 Close关闭文件句柄 "档案"
ITYM>,而不是>>。awk语义不同于shell。无需保存拆分返回代码,并且拆分将RE作为参数,因此除非有理由使用字符串中包含的RE,否则应使用//分隔符,以清晰和简单地表示更复杂的REs.+1:-.@EdMorton谢谢。是的,n=是可选的。顺便说一句,我检查了,它说>>应该用于append,尽管在本例中>,可以保护用户避免多次运行代码更改。同样根据手册第。9.1.3,要拆分的第三个参数称为fieldsep,在第6.1.2节中,手册指出,只有现代版本的awk才允许在此处使用正则表达式常量。>>适用于您特别需要附加到现有文件时,当您只想创建OP所述的文件时,则为>。是的,第三个参数在手册页中命名为fieldsep,它是一个RE,处理方式与FS wrt字段拆分中的REs相同,例如,专门处理单个空格字符,我知道的唯一一个可能不允许RE常量的awk是旧的、损坏的awk,不应使用。如果改为指定一个字符串,则需要担心awk对其进行双重解析,因此需要对要作为literal.ITYM>而不是>>的元字符进行双引号引用。awk语义不同于shell。无需保存拆分返回代码,并且拆分将RE作为参数,因此除非有理由使用字符串中包含的RE,否则应使用//分隔符,以清晰和简单地表示更复杂的REs.+1:-.@EdMorton谢谢。是的,n=是可选的。顺便说一句,我检查了,它说>>应该用于append,尽管在本例中>,可以保护用户避免多次运行代码更改。同样根据手册第。9.1.3,拆分i的第三个参数
在第6.1.2节中,手册指出,只有现代版本的awk才允许在此处使用正则表达式常量。>>适用于您特别需要附加到现有文件时,当您只想创建OP所述的文件时,则为>。是的,第三个参数在手册页中命名为fieldsep,它是一个RE,处理方式与FS wrt字段拆分中的REs相同,例如,专门处理单个空格字符,我知道的唯一一个可能不允许RE常量的awk是旧的、损坏的awk,不应使用。如果您指定了一个字符串,那么您需要担心awk对其进行双重解析,因此需要对要作为文本的元字符进行双引号引用。谢谢,这也很有效。不知道怎么做。。但是谢谢u@theuniverseisflat不客气。我为你添加了一些评论。希望能帮上忙。谢谢。这也行。不知道怎么做。。但是谢谢u@theuniverseisflat不客气。我为你添加了一些评论。希望有帮助。
perl -lane '$,="\n";$F[0]=~/([^*]+)/;open(O,">$1");print O @F[2..$#F];close(O)' file