Creating two files from one file using unix

送分小仙女□ 提交于 2019-12-24 07:48:43

问题


I have one input file, I need to read and apply some condition and route to two other files.

100 COMPANY Records
500ABC COMPANY 345         
2pen9999out
2cow7777out
2goa7777out
500ABC COMPANY IN 456
2car9999out
2cow7777out
2HAT7777out
2BAL9999out
2BAL6666out

here, record start with 5 was header and 2 was detail

i need to create two file ABC_COMPANY.txt and ABC_COMPANY_IN.txt?

I have written below logic, which I want to convert using awk or other right approach?

NUMBER1="666"
NUMBER2="777"
while read line
 do

 REC_IND=`echo "${line}" | awk '{print substr($1,1,1)}'`

 if [ "${REC_IND}" = "5" ]; then
 FILENAME="ABC_COMPANY"
 DEAIL_COMPANY=`echo "${line}" | awk '{print substr($0,3,7)}'`
  if [[ $DEAIL_COMPANY = "ABC COMPANY IN" ]]; then
    FILENAME="ABC_COMPANY_IN"
  fi
fi
#check for detail record
  if [ "${REC_IND}" = "2" ] ;then
 #substring to find value
 Value=`echo "${line}" | awk '{print substr($0,4,9)}'`
  #if record belongs to bank then route to the respective file
  if [ "$Value" = "$NUMBER1" ]  || [ "$Value" = "$NUMBER2" ] ; then
    echo $line >> ${FILENAME}".txt"
  fi
fi
done <  /bk/shan.txthere

expected output:

ABC_COMPANY.txt

2cow7777out
2goa7777out

ABC_COMPANY_IN.txt

2cow7777out
2HAT7777out
2BAL6666out

回答1:


I would recommend using a proper Awk script like something below. This takes care of achieving your requirement as stated in the question and creates two files ABC_COMPANY.txt and ABC_COMPANY_IN.txt with contents as mentioned in the question.

#!/usr/bin/env awk

$1 ~ /^5/ {
    gsub(/[0-9]+/,"")
    gsub(/^[[:space:]]+|[[:space:]]+$/,"")
    gsub(/[[:space:]]/,"_")
    header=$0".txt"    
    openhandles[len++] = header
}

$1 ~ /^2/ && $1 ~ /666|777/ {
    print > header
}

END {
    for (i=0; i<len; i++ )
        close(openhandles[i])
}

Run the script as

awk -f script.awk inputfile

You can use the command-line version of the script as

awk '$1 ~ /^5/ { gsub(/[0-9]+/,""); gsub(/^[[:space:]]+|[[:space:]]+$/,"");
gsub(/[[:space:]]/,"_"); header=$0".txt"; openhandles[len++] = header; }
$1 ~ /^2/ && $1 ~ /666|777/ { print > header }
END {for (i=0; i<len; i++ )  close(openhandles[i]) }' file


来源:https://stackoverflow.com/questions/48018230/creating-two-files-from-one-file-using-unix

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!