我编写了一个shell脚本,它生成了两个csv fileA和fileB文件。我需要在现有的.ksh文件中添加脚本,该文件可以将fileA的第3列添加到要生成的新csv文件的第1列,将fileB的第2列添加到新csv的第2列。有什么办法吗? 例如。
fileA fileB
A B C D 1 2 3 4
output.csv
C 2
使用awk命令我可以读取如下列:
awk -F" " '{print $3}' fileA.csv
但是如何将输出变为所需的列。
答案 0 :(得分:1)
或者如果您喜欢bash(或ksh),请将fileB放在filedescriptor number 3上,并从每个文件中读取一行:
#!/bin/ksh
while read -r a1 a2 a3 a4 && read -r b1 b2 b3 b4 <&3; do
echo $a3 $b2
done < fileA 3<fileB
答案 1 :(得分:1)
答案 2 :(得分:0)
你可以用这样的awk来做:
awk 'FNR==NR{x[FNR]=$3;next} {print x[FNR],$2}' fileA fileB
<强>解释强>
FNR == NR之后的花括号中的部分仅适用于FileA的进入。它将FileA的第三个字段保存在由行号(x[]
)索引的数组FNR
中。第二组花括号适用于FileB的处理。它打印从FileA保存的数组x[]
的元素,后跟FileB的第二个字段。
答案 3 :(得分:0)
或者,如果你喜欢bash数组,你可以将fileA的每一行的第3个字段读入数组A [],将fileB的每一行的第二个字段读入数组B [],然后通过并打印他们并排:
#!/bin/bash
A=($(awk '{print $3}' fileA)) # Read 3rd field of every line of fileA into array A
B=($(awk '{print $2}' fileB)) # Read 2nd field of every line of fileB into array B
for ((i=0;i<${#A[@]};i++))
do
echo "${A[$i]} ${B[$i]}"
done
答案 4 :(得分:0)
请不要赞成这个回答。
bash(我认为第4版)
mapfile -t a < fileA
mapfile -t b < fileB
for (( i=0, i<${#a[@]}; i++ )); do
lineA=( ${a[i]} )
lineB=( ${b[i]} )
echo "${lineA[2]} ${lineB[1]}"
done
红宝石
ruby -e '
a,b = ARGV.map {|f| File.readlines(f).map {|l| l.chomp.split}}
a.each_index {|i| puts "#{a[i][2]} #{b[i][1]}"}
' fileA fileB
的Perl
perl -lE '
($a,$b) = map {open my $f, "<", $_; [map {[split]} <$f>]} @ARGV;
say "$a->[$_][2] $b->[$_][1]" for (0..@$a)
' fileA fileB