在A.csv,有讀線,猛砸
1
2
3
4
我應該怎樣閱讀本文件並創建變量$B
和$C
使:
echo $B
echo $C
回報:
1 2 3 4
1,2,3,4
到目前爲止,我想:
cat A.csv | while read A;
do
echo $A
done
它只返回
1
2
3
4
在A.csv,有讀線,猛砸
1
2
3
4
我應該怎樣閱讀本文件並創建變量$B
和$C
使:
echo $B
echo $C
回報:
1 2 3 4
1,2,3,4
到目前爲止,我想:
cat A.csv | while read A;
do
echo $A
done
它只返回
1
2
3
4
正如@Cyrus說
B=$(cat A.csv)
echo $B
將輸出:
1 2 3 4
因爲bash將不攜帶換行符如果變量不裹報價。如果A.csv
包含任何可能受bash glob擴展影響的字符,這很危險,但如果您只是閱讀簡單的字符串,應該沒問題。
如果你正在讀簡單的字符串與任何元素沒有空格,你還可以通過使用得到$ C你期望的結果:
echo $B | tr ' ' ','
這將輸出:
1,2,3,4
如果A.csv
中的行可能包含bash特殊字符或空格,則我們返回到循環。
爲什麼我格式化文件讀取循環,因爲我有,請參閱:Looping through the content of a file in Bash?
B=''
C=''
while read -u 7 curr_line; do
if [ "$B$C" == "" ]; then
B="$curr_line"
C="$curr_line"
else
B="$B $curr_line"
C="$C,$curr_line"
fi
done 7<A.csv
echo "$B"
echo "$C"
將建設兩個變量,你的願望使用遍歷文件內容,並應防止防止意外通配和分裂。
B=$(cat A.csv)
echo $B
輸出:
1 2 3 4
,隨着行情:
echo "$B"
輸出:
1 2 3 4
適用於OP的當前輸入,但是如果其文件中的某一行有*號(或帶有空格的行),我預計它們的輸出可能會令人驚訝。 –
@CharlesDuffy:你可能是對的。 – Cyrus
試試這個:
cat A.csv | while read A;
do
printf "$A"
done
商祺!
Eh?在這種用法中不會有任何換行符,並且如果它包含格式轉義符,它也會打亂您的輸出。也許你想要'printf'%s'「$ A」',在每個之後打印一個空格,然後在'printf'\ n'後面打印? –
而'cat'只不過是開銷而已 - 在'done'之後使用'
假設bash 4。X,下面是有效的,強大的,和本地:
# Read each line of A.csv into a separate element of the array lines
readarray -t lines <A.csv
# Generate a string B with a comma after each item in the array
printf -v B '%s,' "${lines[@]}"
# Prune the last comma from that string
B=${B%,}
# Generate a string C with a space after each item in the array
printf -v B '%s ' "${lines[@]}"
我將文件讀入到一個bash數組:
mapfile -t array < A.csv
然後,用不同的聯接字符
b="${array[*]}" # space is the default
echo "$b"
c=$(IFS=","; echo "${array[*]}")
echo "$c"
或者,您可以使用paste
加入指定分隔符的所有行:
b=$(paste -d" " -s < A.csv)
c=$(paste -d"," -s < A.csv)
'mapfile'和'readarray'是同義詞,只能在版本> 4.0中使用,'paste'解決方案整齊且兼容3.x! –
試試這個(較簡單的):
b=$(tr '\n' ' ' < file)
c=$(tr '\n' ',' < file)
您不必讀取文件爲。確保你運行了dos2unix file
命令。如果您正在窗口中運行(要刪除\r
)。
說明:它會修改文件。所以,請確保您從原始文件複製。
這裏有什麼「將一個while循環傳入變量」? –