我遇到了一个奇怪的问题。我的命令不读取我从Excel保存的.txt文件。我试图以Excel中可用的所有.txt格式保存数据,但是当我运行命令时它不会读取它。实际上它似乎是读取文件的第一行,但只有当文件的第一行包含Parcela 1
时。如果我从文本编辑器创建一个普通的.txt文件,无论有多少行,它都会读取它。
有谁知道我做错了什么?
我的一个代码:
awk -F"\t" '
{ if ($7 ~ /Parcela 1/)
print;
else }' source.txt > output.txt
答案 0 :(得分:1)
几乎可以肯定的是,这个问题与Unix vs Windows和旧式的Mac line-endings有关。 Excel(至少Excel上的Excel 2008和2011)可以以各种格式编写文件。这些都没有“Unix原生”行结尾。
例如,使用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
的输出显示,所有格式都不是标准的Unix文本文件。 ule
(统一线路结束)计划是我自己设计的一个;它用于默认的“检查”模式。有趣的是,大多数文件没有最终的行序列;数据在没有最终换行符的情况下停止。
$ 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 - aka LF或换行符)结束。在Windows上,通常行以CRLF,回车和换行结束;在经典的Mac OS上(在Mac OS X之前),显然对于带有Office产品的MS-DOS,这些行以CR,回车结束。
awk
读取行。如果您尝试处理其中一个仅包含CR行结尾的文件,awk会认为该文件包含一行。如果您尝试使用CRLF行结尾处理其中一个文件,awk将识别行OK(它们在LF处结束),但会将CR视为最后一个字段的一部分。
因此,根据您的真实情况,您应该使用“Windows *”格式之一。这些文件中的'Parcela 1'行是92,99和102。
awk -F"\t" '{ if ($7 ~ /Parcela 1/) print; }' "Windows Formatted Text.txt"
9/6/19 (Parcela 1)FINANCIAMENTO FATURA JULHO EM 4X (Dividido) "($1,052.38)"
9/6/19 (Parcela 1)ROUPAS GUI 6.1.1.10 - DESPESAS PESSOAIS:6.1.1.10.004 - VESTUARIO ($44.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 ($282.68)
任何其他格式都会以某种形式或形式出现问题,直到您按照awk
识别的格式进行按摩,例如:通过运行:
tr '\r' '\n' < "MS-DOS Comma Separated Text.csv" > "Unix Comma Separated Text.csv"
然后,您可以安全地将awk应用于“Unix Comma Separated Text.csv”文件。