根据条件将文件中的行写入文件X.

时间:2012-11-09 20:20:46

标签: bash

我有一个5000行文本文档,我想逐行阅读。我想将每行写入另一个文本文件,具体取决于它有多少列。每列由a分隔,其由“|”分隔。这样做的最快方法是什么?

编辑:我忘记了文件每个部分的关键细节,每个部分用@,#或$分隔。每一行也必须输出到适当的部分

示例:

cat File.txt

@
01|02|03|04|05|06|07|08|09|10
11|12|13|14|15|16|17|18
21|22|23|24|25
31|32|33|34|35|36|37|38|39|40
#
41|42|43|44|45|46|47|48|49|50
51|52|53|54|55
61|62|63|64|65|66|67|68
71|72|73|74|75|76|77|78|79|80

输出(例如3个文件)

cat Ten.txt

@
01|02|03|04|05|06|07|08|09|10
31|32|33|34|35|36|37|38|39|40
#
41|42|43|44|45|46|47|48|49|50
71|72|73|74|75|76|77|78|79|80

cat Eight.txt 
@
11|12|13|14|15|16|17|18
#
61|62|63|64|65|66|67|68

cat Five.txt
@
21|22|23|24|25
#
51|52|53|54|55

4 个答案:

答案 0 :(得分:2)

这可能有用:

awk -F\| '{ print > "columns-" + NF + ".dat"}' File.txt

它不会将数字翻译成英文,但它会将每一行写入一个名为的文件,例如: columns-10.dat代表有10列的行...

答案 1 :(得分:0)

  • 使用awk
  • set delimiter
  • 打印行数大于或等于N的行。

例如:

$> awk -F "|" '{if (NF >= 10) {print}}' File.txt
01|02|03|04|05|06|07|08|09|10

答案 2 :(得分:0)

这是使用awk执行此操作以查找包含10列的所有行的单行内容:

awk -F'|' '{if (NF==10) {print $0} }'

更一般地说:

#!/bin/bash

awk -F'|' -v cols=$1 '{if (NF==cols) {print $0} }'

答案 3 :(得分:0)

infile.txt:

@
01|02|03|04|05|06|07|08|09|10
11|12|13|14|15|16|17|18
21|22|23|24|25
31|32|33|34|35|36|37|38|39|40
#
41|42|43|44|45|46|47|48|49|50
51|52|53|54|55
61|62|63|64|65|66|67|68
71|72|73|74|75|76|77|78|79|80
$
41|42|43|44|45|46|47|48|49|90

Long Awk单线(可能不必要的长):

awk -F "|" '{if ($0 == "@") {print $0} else {;if ($0 == "\#") {print $0} else {;if (NF == 10) {print $0};}}}' infile.txt > tens.txt

tens.txt

@
01|02|03|04|05|06|07|08|09|10
31|32|33|34|35|36|37|38|39|40
#
41|42|43|44|45|46|47|48|49|50
71|72|73|74|75|76|77|78|79|80
$
41|42|43|44|45|46|47|48|49|90

然后将条款(NF == 10)更改为每次运行时所需的内容。