命令不读整个文件

我有一个奇怪的问题。 我的命令不读取我从Excel保存的.txt文件。 我试图将所有可用的.txt格式的数据保存在Excel中,但是当我运行一个命令时,它不会读取它。 实际上,它似乎读取文件的第一行,但只有该文件的第一行包含Parcela 1 。 如果我从文本编辑器创build一个简单的.txt文件,它会读取它,无论多less行。

有谁知道我在做什么错?

我的一个代码:

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

几乎可以肯定的是,这个问题与Unix vs Windows和老式的Mac系列相关。 Excel(至less在Mac上的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下拉框中select的保存格式。 从file输出显示没有任何格式是标准的Unix文本文件。 ule (统一线结束)程序是我自己devise的程序之一; 它被用于默认的“检查”模式。 有趣的是,大部分文件没有最后的行结束序列; 数据停止没有最后的换行符。

 $ 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,回车和换行符结束; 在经典的Mac OS上(在Mac OS X之前),显然对于Office产品的MS-DOS,行以CR,回车结束。

awk读取行。 如果您尝试仅使用CR行结束处理其中一个文件,awk将认为该文件包含一行。 如果您尝试使用CRLF行尾处理其中一个文件,awk将会识别行(它们以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) 

任何其他格式都会给出某种forms或forms的问题,直到您将其按照awk识别的格式进行处理,例如通过运行:

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

然后,您可以安全地将awk应用于“Unix逗号分隔的Text.csv”文件。