命令不读取整个文件
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" 文件。
我遇到了一个奇怪的问题。我的命令不会读取我从 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" 文件。