创建文件所需的awk sed帮助

时间:2014-04-09 20:05:44

标签: 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

3 个答案:

答案 0 :(得分:4)

awk '{n=split($1,array,"*"); for (i=3;i<=NF;i++) {print $i >array[1]}}' input

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

答案 1 :(得分:4)

仅使用内置个内容:

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

答案 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