我尝试解析csv文件并从字段中获取某些值,这有效:
$ for line in $(cat test.csv); do regiovalue="$(echo $line | awk -F';' '{print $4}')"; echo "regio: ${regiovalue}"; done
regio: TOG
regio: APP
regio: APP
regio: APP
但是我需要在echo输出的末尾添加另一个字符:
$ for line in $(cat test.csv); do regiovalue="$(echo $line | awk -F';' '{print $4}')"; echo "regio: ${regiovalue};"; done
;egio: TOG
;egio: APP
;egio: APP
;egio: APP
正如您所看到的那样,在行的开头添加了添加的分号字符,并替换了该行的第一个字符(r)。顺便说一下它是分号还是任何其他字符并不重要。
这只发生在一个循环中(包括for和read测试),一个简单的回声没有问题:
$ regiovalue=TOG; echo "regio: ${regiovalue};"
regio: TOG;
Bash版本:
$ bash --version | grep bash
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)
答案 0 :(得分:2)
这里的问题是你的行可能以\r
结尾...这会导致光标返回到行的开头(回车)。
$ printf "hello\r\nhow\r\nare\r\nyou\r\n" \
> | hexdump -Cv
00000000 68 65 6c 6c 6f 0d 0a 68 6f 77 0d 0a 61 72 65 0d |hello..how..are.|
00000010 0a 79 6f 75 0d 0a |.you..|
00000016
您应该使用tr
$ printf "hello\r\nhow\r\nare\r\nyou\r\n" \
> | tr -d $'\r' \
> | hexdump -Cv
00000000 68 65 6c 6c 6f 0a 68 6f 77 0a 61 72 65 0a 79 6f |hello.how.are.yo|
00000010 75 0a |u.|
00000012
或设置awk
的记录分隔符:
$ printf "hello\r\nhow\r\nare\r\nyou\r\n" \
> | awk -vRS='\r\n' '{print $0}' \
> | hexdump -Cv
00000000 68 65 6c 6c 6f 0a 68 6f 77 0a 61 72 65 0a 79 6f |hello.how.are.yo|
00000010 75 0a |u.|
00000012
正如dawg所指出的,你可以使用awk
来做所有事情:
awk -vRS='\r\n' -F';' '{print "regio: " $4}' < test.csv