嗨我有一个带条目的输入文件。每行以主机名(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
答案 0 :(得分:4)
awk '{n=split($1,array,"*"); for (i=3;i<=NF;i++) {print $i >array[1]}}' input
以上使用空格作为字段分隔符。因此,对于您的第一个示例行,第一个字段为host1*stop*start
,第二个字段为:
,其余字段为:runit
,stopit
,gather
。我们首先需要从第一个字段中提取主机名。我们通过在字符*
上拆分该字段来实现此目的,该字段将主机名放在变量array[1]
中。然后,我们编写第三个字段,然后将其作为单独的行写入array[1]
命名的文件。
答案 1 :(得分:4)
仅使用内置bash个内容:
while IFS=: read -a ln; do
printf "%s\n" ${ln[@]:1} > "${ln[0]%%\**}"
done < file.txt
:
上的每一行并将其拆分为数组*
和所有后续文本答案 2 :(得分:1)
使用perl
:
perl -lane '$,="\n";$F[0]=~/([^*]+)/;open(O,">$1");print O @F[2..$#F];close(O)' file
perl -lane ' # Split the line on space and load them in an array
$,="\n"; # Set the output list separator to newline
$F[0] =~ /([^*]+)/; # Capture the file name from first array index
open(O,">$1"); # Open a file handle with filename using captured group
print O @F[2..$#F]; # print everything from 3rd index to end of line in that file
close(O) # Close the file handle
' file