我的文本檔案應該是由制表符空格(由 表示\t)分隔的兩列,如下所示。但是,有一些損壞的值,其中第 1 列有兩個由空格分隔的值(用 表示\s)。
A\t1
B\t2
C\sx\t3
D\t4
E\sy\t5
我的目標是創建一個表,如下所示:
A\t1
B\t2
C\t3
D\t4
E\t5
即丟棄第 1 列中空格后出現的第二個值,例如。在C\sx\t3我可以丟棄x空間之后存在的那些并將列存盤為C\t3.
我已經嘗試了幾件事,但沒有運氣。
我嘗試將基于的\t列切割成獨立的列,然后基于切割第一列\s并再次加入它們。但是,它沒有用。這是片段:
col1=(cut -d$'\t' -f1 $file | cut -d' ' -f1)
col2=(cut -d$'\t' -f1 $file)
myArr=()
for((idx=0;idx<${#col1[@]};idx ));do
echo "@{col1[$idx]} @{col2[$idx]}"
# I will append to myArr here
done
輸出將 col2 的串列附加到 col1 as A B C D E 1 2 3 4 5。最重要的是,我的檔案非常大,即 5,300,000 行,所以我想避免遍歷所有記錄并一一追加。
非常感謝任何建議。
謝謝你。:)
uj5u.com熱心網友回復:
假設當你說a space你的意思是一個空白字符然后使用任何 awk:
awk 'BEGIN{FS=OFS="\t"} {sub(/ .*/,"",$1)} 1' file
uj5u.com熱心網友回復:
使用 Perl 正則運算式的解決方案(對我來說,它們比 seds 更容易,并且更便攜,因為 sed 的版本很少)
$ cat ls
A 1
B 2
C x 3
D 4
E y 5
$ cat ls |perl -pe 's/^(\S ).*\t(\S )/$1 $2/g'
A 1
B 2
C 3
D 4
E 5
此代碼從前面獲取所有非空字符,從 \t 之后獲取所有非空字符
uj5u.com熱心網友回復:
嘗試
sed $'s/^\\([^ \t]*\\) [^\t]*/\\1/' file
- Bash的ANSI-C 參考(
$'...') 功能用于使制表符可見為\t.
uj5u.com熱心網友回復:
另一個sed解決方案:
搜索并替換后跟任意數量的非 TAB 字符的任何文字空格,什么都沒有。
sed -E 's/ [^\t] //' file
A 1
B 2
C 3
D 4
E 5
如果那里可能有多個實際空間,那就讓它's/ [^\t] //'...
uj5u.com熱心網友回復:
利用FS并OFS讓他們為您完成所有艱苦的作業
{m,g}awk NF=NF FS='[ \t].*[ \t]' OFS='\t'
A 1
B 2
C 3
D 4
E 5
如果有可能出現前沿或后沿空格和制表符,那么也許
mawk 'NF=gsub("^[ \t] |[ \t] $",_)^_ !_' OFS='\t' RS='[\r]?\n'
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/487296.html
