【问题标题】:How do I write every line to a separate file using awk?如何使用 awk 将每一行写入单独的文件?
【发布时间】:2021-04-28 02:47:02
【问题描述】:

我想将 txt 文件的每一行写入一个单独的文件,并使用第一列作为新文件的名称。然后,新文件应该包含该行中的所有其他内容,但第 1 列除外。

所以当我有:

example_1 a b c d
example_2 e f g h
example_3 j k l m

我想要 3 个名为 example_1.mop、example_2.mop 和 example_3.mop 的单独文件,并包含第一列之后的所有内容。所以 example_1.mop 应该包含 a b c d 等等。

我几乎找到了办法

awk '{printf "%s\n", $2>$1".mop"}' file

但这只会将第二列放入新文件中。我如何告诉 awk 使用除第一列之外的所有内容?

非常感谢您的帮助!

【问题讨论】:

  • 主要是为了不让perl太生锈:perl -anE '$,=" "; open my $f, ">", $F[0]; shift @F, say $f @F' input
  • @William Pursell,对不起,我不知道 perl。你能给这个解释一下吗?非常感谢!
  • 在 perl 中,-a 导致每一行被分割成数组@F。第一列在$F[0],所以我们打开那个文件。 shift 然后丢弃第一个元素并将 @F 的其余部分向下移动一个。 say 打印修改后的数组。 $,=" " 只是在输出中的每个条目之间添加一个空格。

标签: awk


【解决方案1】:

使用您展示的示例,请尝试以下操作。在 GNU awk 中编写和测试,应该可以在任何 awk 中工作。

awk '
{
  first=$1
  $1=""
  sub(/^ +/,"")
  outputFile=first".mop"
  print >> (outputFile)
  close(outputFile)
}
' Input_file

说明:为上述添加详细说明。

awk '                    ##Starting awk program from here.
{
  first=$1               ##Creating first which has 1st field in it.
  $1=""                  ##Nullify 1st field here.
  sub(/^ +/,"")          ##Substituting initial space with NULL here.
  outputFile=first".mop"    ##Creating outputFile which has output file name in it.
  print >> (outputFile)  ##Printing current line into output file.
  close(outputFile)      ##Closing output file in backend.
}
' Input_file             ##Mentioning Input_file name here.

【讨论】:

  • 使用此生成的文件的名称包含除第一列之外的所有内容。这可能是因为留置权“outputFile=$0”.mop“”吗?
  • @Serrah,抱歉有一个错字,我现在已经修正了,请试试我编辑的代码,我们应该很好。
  • 是的,就像一个魅力。非常感谢!并感谢您非常好的解释。这是完美的
  • 感谢您对如何接受答案的解释。我有点困惑
【解决方案2】:
awk '{out=$1".mop"; sub(/[^[:space:]]+[[:space:]]*/,""); print > out; close(out)}' file

【讨论】:

  • 这是完美的。非常感谢!如果可能的话,您能否简要解释一下“sub(...)”部分在做什么?谢谢!
  • 它只是删除了第一个字段,即第一个非空格序列,以及它之后的空格。
  • 啊,好吧,我想,我明白了。谢谢!
  • 我所做的 sub(/[^[:space:]]+[[:space:]]*/,"") 和 @Ravinder 所做的 ($1=""; sub(/^ +/,"")) 之间的区别在于,我将适用于您输入字段之间的任何空格(例如空格和/或制表符),其中他仅适用于空白,我的不会影响其余字段的间距,他会将每个空白链转换为单个空白字符,而我的不会强制 awk 使用 OFS 为每个 FS 重新编译数据.如果您的数据都是单空格分隔的,那么这些都不重要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-13
  • 1970-01-01
  • 2014-09-26
  • 2017-11-20
  • 1970-01-01
相关资源
最近更新 更多