命令不读取整个文件

Command does not read entire file

我遇到了一个奇怪的问题。我的命令不会读取我从 Excel 保存的 .txt 文件。我尝试以 Excel 中可用的所有可用 .txt 格式保存数据,但是当我 运行 命令时它不会读取它。实际上它似乎读取了文件的第一行,但前提是文件的第一行包含 Parcela 1。但是,如果我从文本编辑器创建一个普通的 .txt 文件,无论有多少行,它都会读取它。

有谁知道我做错了什么吗?

我的一个代码:

awk -F"\t" '
{ if ( ~ /Parcela 1/)
    print;
else }' source.txt > output.txt

几乎可以肯定问题与 Unix vs Windows vs 旧式 Mac 行尾有关。 Excel(至少 Excel 2008 和 2011 上 Mac)可以写入多种格式的文件。 None 其中有 'Unix native' 行结尾。

例如,使用Excel 2011,我得到:

$ file *.dif *.csv *.txt *.prn | sort
Data Interchange Format.dif:         Non-ISO extended-ASCII text, with CRLF line terminators
MS-DOS Comma Separated.csv:          Non-ISO extended-ASCII text, with CR line terminators
MS-DOS Formatted Text.txt:           Non-ISO extended-ASCII text, with CR line terminators
Space Delimited Text.prn:            Non-ISO extended-ASCII text, with CR line terminators
Tab Delimited Text.txt:              Non-ISO extended-ASCII text, with CR line terminators
UTF-16 Unicode Text.txt:             Little-endian UTF-16 Unicode text, with CRLF line terminators
Windows Comma Separated.csv:         ISO-8859 text, with CRLF line terminators
Windows Formatted Text.txt:          ISO-8859 text, with CRLF line terminators
$ ule *.dif *.csv *.txt *.prn | sort
Data Interchange Format.dif: 2301 DOS, No final EOL
MS-DOS Comma Separated.csv: 103 Mac, No final EOL
MS-DOS Formatted Text.txt: 103 Mac, No final EOL
Space Delimited Text.prn: 104 Mac
Tab Delimited Text.txt: 103 Mac, No final EOL
UTF-16 Unicode Text.txt: 103 Unix, 103 Mac, No final EOL, 11019 null bytes
Windows Comma Separated.csv: 103 DOS, No final EOL
Windows Formatted Text.txt: 103 DOS, No final EOL
$

文件名与从Excel下拉框中选择的保存格式相对应。 file 的输出显示 none 格式是标准的 Unix 文本文件。 ule(统一行尾)程序是我自己设计的;它以默认的 'check' 模式使用。有趣的是,大多数文件没有行序列的最终结尾;数据在没有最终换行符的情况下停止。

$ ule -h
Usage: ule [-bcdhmnosuzV] [file ...]
  -b  Create backups of the files
  -c  Check line endings (default)
  -d  Convert to DOS (CRLF) line endings
  -h  Print this help and exit
  -m  Convert to MAC (CR) line endings
  -n  Ensure line ending at end of file
  -o  Overwrite original files
  -s  Write output to standard output (default)
  -u  Convert to Unix (LF) line endings
  -z  Check for zero (null) bytes
  -V  Print version information and exit

$

在 Unix 系统上,行以换行符(NL — 也称为 LF 或换行符)结束。在 Windows 上,通常行以 CRLF、回车符 return 和换行结束;在经典 Mac OS 上(在 Mac OS X 之前),显然对于带有 Office 产品的 MS-DOS,行仅以 CR 结尾,马车 return.

awk 读取行。如果您尝试处理其中一个只有 CR 行结尾的文件,awk 将认为该文件只包含一行。如果您尝试处理其中一个具有 CRLF 行结尾的文件,awk 将识别这些行 OK(它们以 LF 结尾),但会将 CR 视为最后一个字段的一部分。

因此,根据您的实际需求,您应该使用 'Windows*' 格式之一。 'Parcela 1' 行在这些文件中是 92、99 和 102。

awk -F"\t" '{ if ( ~ /Parcela 1/) print; }' "Windows Formatted Text.txt"
                9/6/19        (Parcela 1)FINANCIAMENTO FATURA JULHO EM 4X    (Dividido)        "(,052.38)"
                9/6/19        (Parcela 1)ROUPAS GUI    6.1.1.10 - DESPESAS PESSOAIS:6.1.1.10.004 - VESTUARIO        (.70)
                9/6/19        "(Parcela 1)TROCA 2 PNEUS DIANTEIROS, BALANCEAMENTO E ALINHAMENTO FOX"    6.1.1.02 - TRANSPORTE:6.1.1.02.001 - AUTOMOVEL:6.1.1.02.001 - MANUTENCAO    (2.68)

任何其他格式都会以某种形式出现问题,直到您将它们修改为 awk 可识别的格式,例如通过 运行:

tr '\r' '\n' < "MS-DOS Comma Separated Text.csv" > "Unix Comma Separated Text.csv"

然后您可以安全地将 awk 应用于 "Unix Comma Separated Text.csv" 文件。